flask篇B2,重定向,url

flask篇B2,重定向,url,第1张

flask篇B2,重定向,url 重定向与url_for

 

在app1.py文件

from flask import Flask, request, redirect,url_for
from flask import render_template
import json

app=Flask(__name__)

users=[]
@app.route('/',endpoint='index')   # endpoint 和url_for  一起用 endpoint给这个路由起一个别名,url_for根据别名获取路由
def index():

    return render_template('index.html')

@app.route('/register')
def register():
    r=render_template('register.html')  # 默认从模板文件夹中找文件
    print(r)
    return r


@app.route('/register2',methods=['GET','POST']) # methods=['GET','POST'] 如果没有这个默认的只有get,没有post
def register2():  # 获取页面提交的内容
    if request.method=='POST':
        print(request.full_path)  #/register2?username=zhao&address=山西#
        print(request.path)   # /register2  #
        print(request.args)  # dict类型  只能获取get请求的
        # print(request.args.get('username'))  # 获取值
        # print(request.args.get('address'))
        print(request.form)  # 如果请求方法是post 则需要通过request.form取值
        print(request.form.get('username'))
        print(request.form.get('address'))
        username=request.form.get('username')
        username2=request.form.get('username2')
        address=request.form.get('address')
        if username==username2:
            user={'username':username,'address':address}
            users.append(user)
            return redirect(url_for('index'))  # redirect 重定向
        else:
            return '不一样'

    return '不是post'

@app.route('/show')
def show():
    j_str=json.dumps(users)
    return j_str

@app.route('/test')
def test():
    url=url_for('index')  # 路径反向解析
    print(url)
    return 'test'


if __name__=='__main__':
    print(app.url_map)   # 路由规则表
    app.run()


"""
视图函数的返回值:
response响应:
1.str  自动转成response对象
2.dict  json
3.response对象   response对象
4.make_response()  response对象
5.redirect()  重定向  302状态码
6.render_template()  模板渲染+模板




"""

在index.html文件中




    
    首页


注册
登录
展示

在register.html文件中




    
    用户注册页面


京东注册页面

    {#如果是表单提交则必须在表单的元素上添加name属性#}
    


模板语法
"""
视图函数的返回值:
response响应:
1.str  自动转成response对象
2.dict  json
3.response对象   response对象
4.make_response()  response对象
5.redirect()  重定向  302状态码
6.render_template()  模板渲染+模板


模板:[网页]
模板的语法:
1.在模板中获取view中专送的变量值:{{变量名key}}
render_template('模板名字',key=value,key=value)
     name='小明'  # str
    age=18  # int
    friends=['1号','2号','3号'] # list 
    dict1={'gift':'大手镯','gift1':'鲜花','gift2':'费列罗'} # dict
    # 创建对象
    girlfriend=Girl('美美','安徽黄山')  自定义的类构建的类型:Girl对象
    
模板:
{{list.0}}  同 {{list[0]}}
{{dict.key}}  同  {{dict.get(get)}}
{{girl.name}} 同  {{对象.属性}}

2. 控制块:
{% if 条件 %}
{% endif %}

{% if 条件 %}
    条件为true
{% else %}
    条件为False
{% endif %}
    
    
{% for 变量 in 可迭代对象 %}
    for循环要做的任务

{% endfor %}

可以使用loop变量
loop.index  序号从1开始 
loop.index0 序号从0开始
loop.revindex 序号倒着开始最后为1
loop.revindex0 序号倒着开始最后为0
loop.first 布尔类型 是否是第一行
loop.last 布尔类型 是否是第二行

3.过滤器
过滤器本质是函数
模板语法中过滤器:
{{变量名|过滤器(*args)}}
{{变量名|过滤器}}

常见的过滤器:
1. safe:禁用转译
msg='520快乐!'
return render_template('show_2.html',girls=girls,users=users,msg=msg)
不想让它转译:
{{ msg |safe }}
2.capitalize:
单词的首字母大写
{{ n1|capitalize }}
3.lower 和 upper
大小写的转换
4.title  一句话中的首字母大写
msg='She is a beautiful girl'
{{mag|title}}
5.reverse 翻转
{{n1|reverse}}
6.format 格式化
{{ '%s is %d years old'| format('lili',18) }}
7.truncate 字符串截断

list的 *** 作:
{{ girls|first }}
{{ girls|last }}
{{ girls|length }}
{#{{ girls|sum }}整形的计算#}
{{ [1,3,5,7,8]|sum }}
{{ [1,6,5,4,8]|sort }}

dict:
 {% for v in users.0.values() %}  获取值
    

{{ v }}

{% endfor %} {% for k,v in users.0.items() %} 获取键值

{{ k }}--{{ v }}

{% endfor %} {% for k in users.0.keys() %} 获取键

{{ k }}

{% endfor %} """

在app12.py文件中

from flask import Flask,request,render_template

app=Flask(__name__)

class Girl:
    def __init__(self,name,addr):
        self.name=name
        self.gender='女'
        self.addr=addr

    def __str__(self):
        return self.name


@app.route('/show')
def show():
    name='小明'  # str
    age=18  # int
    friends=['1号','2号','3号'] # list
    dict1={'gift':'大手镯','gift1':'鲜花','gift2':'费列罗'} # dict
    # 创建对象
    girlfriend=Girl('美美','安徽黄山')
    return render_template('show.html',name=name,age=age,friends=friends ,dict1=dict1,girl=girlfriend)

if __name__=='__main__':
    app.run()

在show.html文件中




    
    展示


 用户信息展示

用户名是:{{ name }}--{{ age }}
{{ friends.0 }}
{{ friends[1] }}
{{ friends[:1] }}
{{ dict1.gift1 }}--{{ dict1.get('gift') }}
{{ girl.gender }}--{{ girl.name }}--{{ girl.addr }}

 

在app13.py文件中

from flask import Flask,request,render_template

app=Flask(__name__)
app.config.from_object('settings')
@app.route('/show1')
def show1():
    girls=['如花','凤姐','1松松','孙孙','1玲玲','云云']
    users=[
        {'username':'zhansan1','password':'1231','addr':'北京','phone':'13926575656'},
        {'username':'zhansan2','password':'1232','addr':'上海','phone':'13923467576'},
        {'username':'zhansan3','password':'1233','addr':'广州','phone':'13923477777'},
        {'username':'zhansan4','password':'1234','addr':'深圳','phone':'13923458888'},
        {'username':'zhansan5','password':'1235','addr':'杭州','phone':'13923459999'},
    ]
    return render_template('show_1.html',girls=girls,users=users)


if __name__=='__main__':
    app.run()

 在show_1.html文件中




    
    演示控制块
    
        .a{
            color:red;
            font-weight: bold;
        }
    


{#ul....li#}
{#ol....li#}
{#{{ girls }}#}

    {% for girl in girls %} {#遍历出来,for的应用#}
  • {{ girl }}
  • {% endfor %}
    {% for girl in girls %} {#for 和 if 的应用#} {% if girl|length>=3 %} {#如果字数大于等于3#}
  • {{ girl }}
  • {#字体变红加粗#} {% else %} {#否则#}
  • {{ girl }}
  • {% endif %} {% endfor %}
{% for user in users %} {{ user.username }} {{ user.password }} {{ user.addr }} {{ user.phone }} {% endfor %} {% for user in users %} {# #} {{ loop.index }} {#序号从1开始#} {# {{ loop.index0 }}#} {#序号从0开始#} {# {{ loop.revindex }} {#序号倒着开始#} {{ user.username }} {{ user.password }} {{ user.addr }} {{ user.phone }} {% endfor %}

在settings.py文件中

ENV='development'
DEBUG=True

 在app14.py文件中

from flask import Flask,request,render_template

app=Flask(__name__)
app.config.from_object('settings')
@app.route('/show1')
def show1():
    girls=['如花','凤姐','1松松','孙孙','1玲玲','云云']
    users=[
        {'username':'zhansan1','password':'1231','addr':'北京','phone':'13926575656'},
        {'username':'zhansan2','password':'1232','addr':'上海','phone':'13923467576'},
        {'username':'zhansan3','password':'1233','addr':'广州','phone':'13923477777'},
        {'username':'zhansan4','password':'1234','addr':'深圳','phone':'13923458888'},
        {'username':'zhansan5','password':'1235','addr':'杭州','phone':'13923459999'},
    ]
    girls.append('zhangsan')
    msg='520快乐!'
    n1='hello'
    return render_template('show_2.html',girls=girls,users=users,msg=msg,n1=n1)


if __name__=='__main__':
    app.run()

在show_2.html文件中




    
    过滤器的使用


当前用户共:{{ girls |length}}人

{#过滤器转译#}
{{ msg |safe }}

{{ n1|capitalize }}

{{ n1|upper }}

{{n1|reverse}}

{{ '%s is %d years old'| format('lili',18) }}

{{ 'hello world'| truncate(5) | upper }}

{#列表过滤器的使用#}
{{ girls|first }}
{{ girls|last }}
{{ girls|length }}
{#{{ girls|sum }}整形的计算#} {{ [1,3,5,7,8]|sum }}
{{ [1,6,5,4,8]|sort }}

{{ users.0 }}
{% for v in users.0.values() %}

{{ v }}

{% endfor %} {% for k,v in users.0.items() %}

{{ k }}--{{ v }}

{% endfor %} {% for k in users.0.keys() %}

{{ k }}

{% endfor %}

在settings.py文件中

ENV='development'
DEBUG=True
模板 自定义过滤器
过滤器本质是函数
1.通过flask模块中的add_templete_filter方法
    a.定义函数,带有参数和返回值
    b.添加过滤器 app.add_template_filter(function,name='')
    c.在模板中使用:{{变量|自定义过滤器}}
2.使用装饰器完成
    a.定义函数,带有参数和返回值
    b.通过装饰器完成,@app.template_filter('过滤器名字')装饰步骤-的函数
    c.在模板中使用:{{变量|自定义过滤器}}

在app15.py文件中

from flask import Flask,render_template
import settings
app=Flask(__name__)
app.config.from_object(settings)
@app.route('/')
def hello_world():
    msg='hello everyone hello world'
    li=[3,7,9,1,5]
    return render_template('define_filter.html',msg=msg,li=li)

# 过滤器本质是函数
# 第一种方式
def replace_hello(value):
    print('----',value)
    value=value.replace('hello','')
    print('====',value)
    return value.strip()  # 替换的结果返回

app.add_template_filter(replace_hello,'replace')

# 第二种方式 装饰器
@app.template_filter('listreverse')
def reverse_list(li):
    temp_li=list(li)
    temp_li.reverse()
    return temp_li

if __name__=='__main__':
    app.run()

在define_filter.html文件中




    
    自定义过滤器


{{ msg }}

{{ msg| replace }}

{{ li }}

{{ li|listreverse }}

复用
模板继承
include
宏


模板继承:
需要模板继承的情况:
1.多个模板具有完全相同的顶部和底部
2.多个模板具有相同的模板内容,但是内容中部分不一样
3.多个模板具有完全相同的模板内容

标签:
{% block 名字 %}

{% endblock %}

1.定义父模块
2.子模板继承父模板
步骤:
父模板:
1.定义一个base.html的模板
2.分析模板中那些是变化的比如:{% block title %}父模板的title{% endblock %}
  对变化的部分用block进行“预留位置”也称作:挖坑
3.注意:样式和脚本 需要提前预留
    {% block mycc %}{% endblock %}
    {% block myjs %}{% endblock %}
    
子使用父模板:
1.{% extends '父模板的名称'%}将父模板继承过来
2.找到对应的block(坑)填充,每一个block都是有名字的。

include:包含
在A,B,C页面有共同的部分,但是其他页面没有这部分。
这个时候考虑使用include
步骤:
1.先定义一个公共的模板部分,xxx.html
2.谁使用则include过来,{% include '文件夹/xxx.html'%}

宏:macro
1.把它看做是jinja2的一个函数,这个函数可以返回一个HTML字符串
2.目的:代码可以复用,避免代码冗余

定义两种方式:
1.在模板中直接定义:
    类似: macro1.html 中定义方式
2.将所有宏提取到一个模板中:macro.html
    谁想使用谁导入:
    {% import 'macro.html' as xxx %}
    {{ xxx.宏名字(参数)}}
    
总结:
变量:{{变量}}
块:
{% if 条件%}.....{% endif %}
{% for 条件%}.....{% endif %}
{% block 条件%}.....{% endblock %}
{% macro 条件%}.....{% endmacro %}


{% include''%} 包含
{% import''%} 导入宏
{% extends''%} 

{{url_for('static',filename='')}}
{{hongname(XXX)}}
模板继承、include、宏

 base.html文件和index.html文件是模板继承

header.html文件和index.html文件是include

macro.html文件和macro1.html和macro2.html是宏

app16.py文件是公共部分

在app16.py文件中

from flask import Flask,render_template
import settings
app=Flask(__name__)
app.config.from_object(settings)

@app.route('/base')
def load_base():
    return render_template('base.html')

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/welcome')
def welcome():
    return render_template('welcome.html')

@app.route('/macro')
def use_macro():
    return render_template('macro/macro1.html')

@app.route('/macro1')
def use_macro1():
    return render_template('macro/macro2.html')


if __name__=='__main__':
    app.run()

在macro.html文件中

{#定义宏#}
{% macro form(action,value='登录',method='post') %}
    
{% endmacro %}
上面这是用宏封装好的宏,可以调用

在macro1.html文件中




    
    宏的定义


{#定义宏#}
{% macro form(action,value='登录',method='post') %}
    
{% endmacro %}
{#调用宏#}
{{ form('/') }}

在macro2.html文件中




    
    宏的使用2


{% import 'macro/macro.html' as func %}
{{ func.form('/welcome',value='注册') }}

{% set username='zhangsan' %}  # set 声明 是全局变量
{{ username }}

{% with num=1000 %}  # with 声明的是局部变量
    {{ num }}
{% endwith %}
{{ num }}

调用macro文件中的宏form,{% import 'macro/macro.html' as func %}是把macro文件中的宏导过来,'/welcome',value='注册'是传的参数

在welcome.html文件中




    
    欢迎页面


{% include 'common/header.html' %}




在header.html文件中



    
    头部




在base.html文件中




    
    {% block title %}父模板的title{% endblock %}   {#标记#}
    
        #head{
            height:50px;
            background-color: bisque;
        }
        #head ul{
            list-style: none;
            height: 50px;
        }
        #head ul li{
            float:left;
            width: 100px;
            text-align: center;
            font-size: 18px;
            height: 50px;
            line-height: 50px;
        }

        #middle{
            height: 900px;
            background-color: azure;


        }

        #foot{
            height: 50px;
            line-height: 50px;
            background-color: darkseagreen;
        }
    
    {% block mycc %}{% endblock %}   {#标记#}


    
        
  • 首页
  • 秒杀
  • 超市
  • 图书
  • 会员
{% block middle %} {#标记#} {% endblock %} 我是底部 {% block myjs %} {#标记#} {% endblock %}

在index.html文件中

{% extends 'base.html' %}
{% block title %}
    首页
{% endblock %}
{% block mycc %}
    
        #middle{
            background-color: deeppink;
            color: white;
            font-weight: bold;
        }
    .div1{
        width: 33%;
        height: 500px;
        float: left;
        border: 1px solid red;
    }

    

    
{% endblock %}

{% block myjs %}
    
{% endblock %}

{% block middle %}
    
    
    
    { url_for('static',filename='images/43.jpeg') }}" alt="">
{% endblock %}

43.jpeg是张图片

在style.css文件中

#d1{
    background-color:aquamarine;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5443474.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存