Python框架【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 函数

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

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

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

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

注意

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

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

 

@app.route('/post/list//')
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函数原因

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

 问题

为什么选择 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,那么就会给搜索引擎造成一个误解。加了斜杠,就不会出现没有斜杠的情况。

 响应-重定向

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

永久性重定向:

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)

响应-响应内容

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

 返回字符串

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'}

响应-自定义响应

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

 创建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

模板介绍

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

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

提示 :

漂亮的页面需要 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。

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

 模板的使用

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

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

使用步骤

创建模板

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

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

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

设置模板查找路径

模板处理数据

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

 

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

模板-传参

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

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

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


@app.route('/')
def hello_world():
    return
render_template('index.html',uname='txc')



    
    txc


     从模版中渲染的数据
     
{{ uname}}

小技巧

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

 

@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函数

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

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

 提示

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

例如: {{ url_for(func) }}

@app.route('/accounts/login//')
def login(name):
    print(name)
    return '通过URL_FOR定位过来的!!!'
登录

注意

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

 

过滤器介绍

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

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

@app.route('/')
def hello_world():
    return
render_template('index.html',postion=-1)



    
    apd


    

过滤器的基本使用

位置的绝对值为[未使用过滤器]:{{ postion}}

位置的绝对值为[使用过滤器]:{{ postion|abs}}

Jinja模板自带过滤器

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

 过滤器是通过管道符号 | 使用的,例如: { 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过滤器


    

default过滤器

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

转义字符


    

转义字符过滤器

转义前的数据是:{{ info | safe }} {% autoescape true %} {{info }} {% endautoescape %}

其它过滤器


    

其它过滤器

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

小提示

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

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

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

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

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

你可能感兴趣的:(Python框架入门到实战,python,重定向,自定义响应,过滤器介绍)