Flask框架【url_for 函数、重定向、响应内容、自定义响应、模板介绍、模板的使用、过滤器介绍、Jinja模板自带过滤器】(二)

👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白
📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
🍂博主正在努力完成2023计划中:以梦为马,扬帆起航,2023追梦人

🔥🔥🔥 python入门到实战专栏:从入门到实战 

🔥🔥🔥 Python爬虫开发专栏:从入门到实战

🔥🔥🔥 Python办公自动化专栏:从入门到实战

🔥🔥🔥 Python数据分析专栏:从入门到实战

🔥🔥🔥 Python前后端开发专栏:从入门到实战

目录

url_for 函数

使用url_for函数原因

 响应-重定向

响应-响应内容

响应-自定义响应

模板介绍

 模板的使用

模板-传参

模板使用url_for函数

过滤器介绍

Jinja模板自带过滤器


url_for 函数

 一般我们通过一个 URL就可以执行到某一个函数。

如果反过来,我们知道一个函数,怎么去获得这个 URL呢?

url_for 函数就可以帮我们实现这个功能。

注意

url_for 函数可以接收1个及以上的参数,他接收函数名作为第一个参数

如果还出现其他的参数,则会添加到 URL 的后面作为查询参数。

@app.route('/post/list/<page>/')
def my_list(page):
    return 'my list'


@app.route('/')
def hello_world():
    return url_for('my_list',page=2,num=8)
    # return "/post/list/2?num=8"

使用url_for函数原因

 问题

为什么选择 url_for 而不选择直接在代码中拼 URL 的原因有两点

 回答

1、 将来如果修改了 URL ,但没有修改该 URL 对应的函数名,就不用到处去替换URL了

2 、url_for() 函数会转义一些特殊字符和 unicode 字符串,这些事情 url_for 会自动的帮我们

@app.route('/login/')
def login():
    return 'login'


@app.route('/')
def hello_world():
 return url_for('login', next='/')
    # /login/?next=/
    # 会自动的将/编码,不需要手动去处理。
    # url=/login/?next=%2F

技巧

在定义url的时候,一定要记得在最后加一个斜杠。

1. 如果不加斜杠,那么在浏览器中访问这个url的时候,如果最后加了斜杠,那么就访问不到。这样用户体验不太好。

2. 搜索引擎会将不加斜杠的和加斜杠的视为两个不同的url。而 其实加和不加斜杠的都是同一个url,那么就会给搜索引擎造成一个误解。加了斜杠,就不会出现没有斜杠的情况。

 响应-重定向

永久性重定向:

http 的状态码是 301,多用于旧网址被废弃了要转到一个新的网址确保用户的访问

比如:你输入 www.jingdong.com 的时候,会被重定向到 www.jd.com

因为 jingdong.com 这个网址已经被废弃了,被改成 jd.com 所以这种情况下应该用永久重定向

暂时性重定向: 

http 的状态码是 302,表示页面的暂时性跳转。

比如:访问一个需要权限的网址,如果当前用户没有登录,应该重定向到登录页面,

这种情况下,应该用暂时性重定向。

 flask中重定向

重定向是通过 redirect(location,code=302) 这个函数来实现的, location表示需要重定向到的 URL, 应该配合之前讲的 url_for() 函数来使用, code 表示采用哪个重定向,默认是 302 也即暂时性重定向, 可以修改成 301 来实现永久性重定向

from flask import
Flask,request,url_for,redirect
app = Flask(__name__)
@app.route('/')
def hello_world():
    return 'Hello World!'
@app.route('/login/')
def login():
    return '这是登录页面'


#falsk中重定向
@app.route('/profile/')
def proflie():
    if request.args.get('name'):
        return '个人中心页面'
    else:
        # return redirect(url_for('login'))
        return
redirect(url_for('login'),code=302)


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

响应-响应内容

 返回字符串

from flask import redirectd


@app.route('/return_str')
def return_str():
    return "你好,少年"

返回JSON

from flask import jsonify

app.config['JSON_AS_ASCII'] = False

@app.route('/return_json1')
def return_json1():
    json_dict = {
        "msg_int": 10,
        "msg_str": "你好,少年"
   }
    return jsonify(json_dict)


@app.route('/return_json2')
def return_json2():
    json_dict = {
        "msg_int": 10,
        "msg_str": "你好,少年"
   }
    return json_dict

元组方式

可以返回一个元组,元组中必须至少包含一个项目,且项目应当由 (response, status) (response, headers) 或者 (response, status, headers) 组成。 status 的值会重载状态代码, headers 是一个由额外头部值组成的列表或字典 status 值会覆盖状态代码, headers 可以是一个列表或字典,作为额外的消息标头值。

@app.route('/demo1')
def demo1():
    # return '状态码为 666', 666
    # return '状态码为 666', 666, [('itxiaotong', 'Python')]
    return '状态码为 666', 666, {'itxiaotong': 'Python'}

响应-自定义响应

 创建Response

from flask import Response

@app.route('/return_str')
def return_str():
    return Response("你好,少年")

make_response方式

@app.route('/demo2')
def demo2():
    resp = make_response('make response测试')
    resp.headers['itxiaotong'] = 'Python'
    resp.status = '404 not found'
    return resp

模板介绍

 思考 : 网站如何向客户端返回一个漂亮的页面呢?

提示 :

漂亮的页面需要 html 、 css 、 js .

可以把这一堆字段串全都写到视图中, 作为 HttpResponse() 的参数,响应给客户端

问题

1、视图部分代码臃肿, 耦合度高

2、这样定义的字符串是不会出任何效果和错误的

3、效果无法及时查看.有错也不容易及时发现

解决问题

模板 Template

1、MVT 设计模式中的 T , Template

M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理。

V全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返回应答。

T全拼为Template,与MVC中的V功能相同,负责封装构造要返回的html。

 模板的使用

 在 Flask中,配套的模板是 Jinja2,Jinja2的作者也是Flask的作者。 这个模板非常的强大,并且执行效率高。

使用步骤

创建模板

应用 同级目录下创建模板文件夹 templates . 文件夹名称固定写法.

templates 文件夹下, 创建 应用 同名文件夹. 例, Book

应用 同名文件夹下创建 网页模板 文件. 例 : index.html

设置模板查找路径

模板处理数据

 

from flask import Flask,render_template
app = Flask(__name__)
@app.route('/test')
def index():
    return render_template('index.html')

模板-传参

 在使用 render_template 渲染模版的时候,可以传递关键字参数(命名参数)。

from flask import Flask,render_template
app = Flask(__name__)


@app.route('/')
def hello_world():
    return
render_template('index.html',uname='txc')
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>txc</title>
</head>
<body>
     从模版中渲染的数据
     <br>
     {{ uname}}
</body>
</html>

小技巧

如果你的参数项过多,那么可以将所有的参数放到一个字典中, 然后在传这个字典参数的时候,使用两个星号,将字典打散成关键字参数(也叫命名参数)

@app.route('/')
def hello_world():
    context = {
        'uname': 'momo',
        'age': 18,
        'country': 'china',
        'childrens': {
            'name': 'mjz',
            'height': '62cm'
       }
   }
    return
render_template('index.html',**context)

获取方式是: {{childrens.name}} 或者 {{childrens['name']}}

模板使用url_for函数

 模版中也可使用 url_for ,和后台视图函数中的 url_for 使用起来基本是一模一样的。

 提示

在模板中使用函数,需要在函数 左右两边加上2个 {}

例如: {{ url_for(func) }}

@app.route('/accounts/login/<name>/')
def login(name):
    print(name)
    return '通过URL_FOR定位过来的!!!'
<a href="{{ url_for('login',p1='abc',p2='ddd',name='艾派徳') }}">登录</a>

注意

无论是 路径参数 还是 查询式参数 都可以直接传递

过滤器介绍

 有时候我们想要在模版中对一些变量进行处理,那么就必须需要类似于Python中的函数一样,可以将这个值传到函数中,然后做一些 操作。

在模版中,过滤器相当于是一个函数,把当前的变量传入到过滤器中,然后过滤器根据自己的功能,再返回相应的值,之后再将结果渲染到页面中

@app.route('/')
def hello_world():
    return
render_template('index.html',postion=-1)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>apd</title>
</head>
<body>
    <h3>过滤器的基本使用</h3>
    <p>位置的绝对值为[未使用过滤器]:{{ postion}}
</p>
    <p>位置的绝对值为[使用过滤器]:{{ postion|abs}}</p>
</body>
</html>

Jinja模板自带过滤器

 过滤器是通过管道符号 | 使用的,例如: { name|length }} 将返回name的长度。

过滤器相当于是一个函数,把当前的变量传入到过滤器中,然后过滤器根据自己的功能,再返回相应的值,之后再将结果渲染到页面中。

Jinja2中内置了许多过滤器

Template Designer Documentation — Jinja Documentation (3.0.x)

过滤器名解释举例
abs(value)返回一个数值的绝对值-1|abs
int(value)将值转换为int类型
float(value)将值转换为float类型
string(value)将变量转换成字符串
default(value,default_value,boolean=false)如果当前变量没有值,则会使用参数中的值来代替。如果想使用python的形式判断是否为false,则可以传递 boolean=true。也可以使用or来替换name|default('xiaotuo')
safe(value)如果开启了全局转义,那么safe过滤器会将变量关掉转义content_html|safe
escape(value)或e转义字符,会将等符号转义成HTML中的符号content|escape或content|e。
first(value)返回一个序列的第一个元素names|first
format(value,*arags,**kwargs)格式化字符串{{ "%s"- "%s"|format('Hello?',"Foo!") }} 输出 Hello?-Fool!
last(value)返回一个序列的最后一个元素。示例: names|last
length(value)返回一个序列或者字典的长度。示例: names|length
join(value,d='+')将一个序列用d这个参数的值拼接成字符 串
lower(value)将字符串转换为小写
upper(value)将字符串转换为小写
replace(value,old,new)替换将old替换为new的字符串
truncate(value,length=255,killwords=False)截取length长度的字符串
striptags(value)删除字符串中所有的HTML标签,如果出 现多个空格,将替换成一个空格
trim截取字符串前面和后面的空白字符
wordcount(s)计算一个长字符串中单词的个数

defalut过滤器

<body>
    <h1>default过滤器</h1>
    过滤前的昵称数据是:{{nick_name}}<br>
    过滤后的昵称数据是:{{nick_name | default('用户1',boolean=true)}}<br>
    过滤后的昵称数据是:{{nick_name or '用户2'}}<br>
</body>

转义字符

<body>
    <h1>转义字符过滤器</h1>
    <!-- 模板中默认 做了转义字符的效果 -->
    转义前的数据是:{{ info | safe }}  <!-- 不转义:不将特殊字符转换成 &lt;类似的数据 -->
   {% autoescape true %} <!-- false代表不再转义特殊字符 / true 转义特殊字符  &lt;-->
   {{info }}  <!-- 转义:将特殊字符转换成 &lt;类似的数据 -->
   {% endautoescape %}
</body>

其它过滤器

<body>
    <h1>其它过滤器</h1>
    绝对值:{{ -6 | abs }}<br>
    小数: {{ 6 | float }}<br>
    字符串:{{ 6 | string }}<br>
    格式化:{{'%s--%s' | format('我','你')}}<br>
    长度:{{'我是九,你是三,除了你,还是你'|length}}<br>
    最后一个:{{'我是九,你是三,除了你,还是你'|last}}<br>
    第一个:{{'我是九,你是三,除了你,还是你'|first}}<br>
    统计次数: {{'我是九,你是三,除了你,还是你' |wordcount }}<br>
    替换:{{'===我是九,你是三,除了你,还是你====' |replace('我是九,你是三,除了你,还是你','拿着,这个无限额度的黑卡,随便刷')}}
</body>

小提示

jinja2模板 默认全局开启了自动转义功能

        1、safe 过滤器:可以关闭一个字符串的自动转义

        2、escape 过滤器:对某一个字符串进行转义

       3、autoescape 标签,可以对他包含的代码块关闭或开启自动转义

                {% autoescape true/false %} 代码块 {% endautoescape %}

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值