flask篇B2,重定向,url_for,模板语法

重定向与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文件中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<a href="/register">注册</a><br>
<a href="">登录</a><br>
<a href="/show">展示</a><br>
</body>
</html>

在register.html文件中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户注册页面</title>
</head>
<body>
<h1>京东注册页面</h1>
<div>
    {#如果是表单提交则必须在表单的元素上添加name属性#}
    <form action="register2" method="post">  {#method="get"#}
        <input type="text" name='username' placeholder="输入用户名">  {#name='xxxx'就是传给register2的内容#}
        <input type="text" name='address' placeholder="请输入地址">   {#name='xxxx'就是传给register2的内容#}
        <input type="text" name="username2" placeholder="确认用户名">
        <input type="submit" value="提交">
    </form>
</div>
</body>
</html>

模板语法

"""
视图函数的返回值:
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='<h1>520快乐!</h1>'
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() %}  获取值
    <p>{{ v }}</p>
    {% endfor %}
<hr>
    {% for k,v in users.0.items() %}  获取键值
        <p>{{ k }}--{{ v }}</p>
    {% endfor %}
<hr>
    {% for k in users.0.keys() %}  获取键 
    <p>{{ k }}</p>
    {% 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文件中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>展示</title>
</head>
<body>
 <div>用户信息展示</div>
<p>
    用户名是:{{ name }}--{{ age }}<br>
    {{ friends.0 }}<br>
    {{ friends[1] }}<br>
    {{ friends[:1] }}<br>
    {{ dict1.gift1 }}--{{ dict1.get('gift') }} <br>
    {{ girl.gender }}--{{ girl.name }}--{{ girl.addr }}

</p>

</body>
</html>

 

在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文件中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>演示控制块</title>
    <style>
        .a{
            color:red;
            font-weight: bold;
        }
    </style>
</head>
<body>
{#ul....li#}
{#ol....li#}
{#{{ girls }}#}

<ul>
{% for girl in girls %}  {#遍历出来,for的应用#}
    <li>{{ girl }}</li>
{% endfor %}
</ul>

<hr>

<ul>
    {% for girl in girls %}  {#for 和 if 的应用#}
        {% if girl|length>=3 %}  {#如果字数大于等于3#}
            <li class="a">{{ girl }}</li>  {#字体变红加粗#}
        {% else %}  {#否则#}
            <li>{{ girl }}</li>
        {% endif %}
    {% endfor %}

</ul>
<hr>

<table border="1" cellspacing="0" cellpadding="0" width="50%">
    {% for user in users %}
    <tr>
        <td>{{ user.username }}</td>
        <td>{{ user.password }}</td>
        <td>{{ user.addr }}</td>
        <td>{{ user.phone }}</td>
    </tr>
    {% endfor %}
</table>

<hr>
<table border="1" cellspacing="0" cellpadding="0" width="50%">
    {% for user in users %}
{#    <tr {% if loop.last %}style="background-color: deeppink" {% endif %}>#}
    <tr {% if loop.index==1 %}style="background-color: deeppink" {% endif %}>
        <td>{{ loop.index }}</td>  {#序号从1开始#}
{#        <td>{{ loop.index0 }}</td>#}  {#序号从0开始#}
{#        <td>{{ loop.revindex }}</td>   {#序号倒着开始#}
        <td>{{ user.username }}</td>
        <td>{{ user.password }}</td>
        <td>{{ user.addr }}</td>
        <td>{{ user.phone }}</td>
    </tr>
    {% endfor %}
</table>


</body>
</html>

在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='<h1>520快乐!</h1>'
    n1='hello'
    return render_template('show_2.html',girls=girls,users=users,msg=msg,n1=n1)


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

在show_2.html文件中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>过滤器的使用</title>
</head>
<body>
当前用户共:{{ girls |length}}人
<hr>
{#过滤器转译#}
{{ msg |safe }}
<hr>
{{ n1|capitalize }}
<hr>
{{ n1|upper }}
<hr>
{{n1|reverse}}
<hr>
{{ '%s is %d years old'| format('lili',18) }}
<hr>
{{ 'hello world'| truncate(5) | upper }}
<hr>
{#列表过滤器的使用#}
{{ girls|first }}<br>
{{ girls|last }}<br>
{{ girls|length }}<br>
{#{{ girls|sum }}整形的计算#}
{{ [1,3,5,7,8]|sum }}<br>
{{ [1,6,5,4,8]|sort }}<br>

<p>
    {{ users.0 }}<br>
    {% for v in users.0.values() %}
    <p>{{ v }}</p>
    {% endfor %}
<hr>
    {% for k,v in users.0.items() %}
        <p>{{ k }}--{{ v }}</p>
    {% endfor %}
<hr>
    {% for k in users.0.keys() %}
    <p>{{ k }}</p>
    {% endfor %}

</p>

</body>
</html>

在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文件中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>自定义过滤器</title>
</head>
<body>
{{ msg }}
<hr>
{{ msg| replace }}
<hr>
{{ li }}
<hr>
{{ li|listreverse }}
</body>
</html>

复用

模板继承
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') %}
    <form action="action" method="{{ method }}">
        <input type="text" placeholder="用户名" name="username">
        <br>
        <input type="password" placeholder="密码" name="password">
        <br>
        <input type="submit" value="{{ value }}">
    </form>
{% endmacro %}
上面这是用宏封装好的宏,可以调用

在macro1.html文件中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>宏的定义</title>
</head>
<body>
{#定义宏#}
{% macro form(action,value='登录',method='post') %}
    <form action="action" method="{{ method }}">
        <input type="text" placeholder="用户名" name="username">
        <br>
        <input type="password" placeholder="密码" name="password">
        <br>
        <input type="submit" value="{{ value }}">
    </form>
{% endmacro %}
{#调用宏#}
{{ form('/') }}
</body>
</html>

在macro2.html文件中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>宏的使用2</title>
</head>
<body>
{% import 'macro/macro.html' as func %}
{{ func.form('/welcome',value='注册') }}

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

{% with num=1000 %}  # with 声明的是局部变量
    {{ num }}
{% endwith %}
{{ num }}
</body>
</html>

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

在welcome.html文件中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>欢迎页面</title>
</head>
<body>
{% include 'common/header.html' %}
<div style="background-color: darkseagreen;height: 100px;"></div>
</body>
</html>

在header.html文件中
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>头部</title>
</head>
<body>
<div style="height:50px;background-color: deeppink"></div>
</body>
</html>

在base.html文件中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}父模板的title{% endblock %}</title>   {#标记#}
    <style>
        #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;
        }
    </style>
    {% block mycc %}{% endblock %}   {#标记#}
</head>
<body>
    <div id="head">
        <ul>
            <li>首页</li>
            <li>秒杀</li>
            <li>超市</li>
            <li>图书</li>
            <li>会员</li>
        </ul>
    </div>
    <div id="middle">
        {% block middle %}  {#标记#}
            <button id="btn">我是中间部分</button>

        {% endblock %}


    </div>
    <div id="foot">
        我是底部

    </div>
{% block myjs %}  {#标记#}

{% endblock %}


</body>
</html>

在index.html文件中

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

    </style>

    <link rel="stylesheet" href="{{ url_for('static',filename='css/style.css')}}">
{% endblock %}

{% block myjs %}
    <script>
            btn=document.getElementById('btn')
            btn.οnclick=(function () {
                alert('别点我!')

            })



    </script>
{% endblock %}

{% block middle %}
    <div class="div1" id="d1"></div>
    <div class="div1"></div>
    <div class="div1"></div>
    <img src="{{ url_for('static',filename='images/43.jpeg') }}" alt="">
{% endblock %}

43.jpeg是张图片

在style.css文件中

#d1{
    background-color:aquamarine;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值