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

news2024/12/22 23:09:20

👏作者简介:大家好,我是爱敲代码的小王,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 %}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/903337.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据课程K3——Spark的常用案例

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 掌握Spark的常用案例——WordCount&#xff1b; ⚪ 掌握Spark的常用案例——求平均值&#xff1b; ⚪ 掌握Spark的常用案例——求最大值和最小值&#xff1b; ⚪ 掌握…

​8th参考文献:[8]许少辉.乡村振兴战略下传统村落文化旅游设计[M]北京:中国建筑出版传媒,2022.

​&#xff18;th参考文献&#xff1a;&#xff3b;&#xff18;&#xff3d;许少辉&#xff0e;乡村振兴战略下传统村落文化旅游设计&#xff3b;&#xff2d;&#xff3d;北京&#xff1a;中国建筑出版传媒&#xff0c;&#xff12;&#xff10;&#xff12;&#xff12;&…

根据源码,模拟实现 RabbitMQ - 内存数据管理(4)

目录 一、内存数据管理 1.1、需求分析 1.2、实现 MemoryDataCenter 类 1.2.1、ConcurrentHashMap 数据管理 1.2.2、封装交换机操作 1.2.3、封装队列操作 1.2.4、封装绑定操作 1.2.5、封装消息操作 1.2.6、封装未确认消息操作 1.2.7、封装恢复数据操作 一、内存数据管理…

机器学习深度学习——NLP实战(情感分析模型——数据集)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——BERT&#xff08;来自transformer的双向编码器表示&#xff09; &#x1f4da;订阅专栏&#xff1a;机器…

【数据结构】_7.二叉树

目录 1.树形结构 1.1 树的概念 1.2 树的相关概念 1.3 树的表示 1.4 树在实际中的应用—表示文件系统的目录树结构 ​编辑​2.二叉树 2.1 概念 2.2 特殊二叉树 2.3 二叉树的性质 2.4 二叉树的存储结构 2.4.1 顺序存储结构&#xff08;数组存储结构&#xff09; 2.4.2…

LeetCode--HOT100题(36)

目录 题目描述&#xff1a;146. LRU 缓存&#xff08;中等&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;146. LRU 缓存&#xff08;中等&#xff09; 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache…

引人关注的领域 ---- 信号稀疏表示

本篇文章是博主在人工智能等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在学习摘录和笔记专…

redis实战-缓存数据解决缓存与数据库数据一致性

缓存的定义 缓存(Cache),就是数据交换的缓冲区,俗称的缓存就是缓冲区内的数据,一般从数据库中获取,存储于本地代码。防止过高的数据访问猛冲系统,导致其操作线程无法及时处理信息而瘫痪&#xff0c;这在实际开发中对企业讲,对产品口碑,用户评价都是致命的;所以企业非常重视缓存…

基于蜉蝣算法优化的BP神经网络(预测应用) - 附代码

基于蜉蝣算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于蜉蝣算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.蜉蝣优化BP神经网络2.1 BP神经网络参数设置2.2 蜉蝣算法应用 4.测试结果&#xff1a;5.Matlab代码 摘要…

MySQL8.0.26-Linux版安装

MySQL8.0.26-Linux版安装 1. 准备一台Linux服务器 云服务器或者虚拟机都可以; Linux的版本为 CentOS7; 2. 下载Linux版MySQL安装包 MySQL :: Download MySQL Community Server (Archived Versions) 3. 上传MySQL安装包 4. 创建目录,并解压 mkdir mysql ​ tar -xvf mysql-8…

网站老域名跳转到新域名有哪些方法?内网穿透内网主机让外网访问

在网站服务器变更及本地主机搭建时&#xff0c;我们经常会遇到老域名地址跳转到新URL的配置&#xff0c;一些朋友还会面对无公网IP让外网访问的问题。今天我们来了解下网站老域名跳转到新域名有哪些方法&#xff0c;以及如何通过内网穿透实现内网主机让外网访问。 网站老域名跳…

【Unity小技巧】Unity2D TileMap的探究(最简单,最全面的TileMap使用介绍)

文章目录 前言介绍一、TileMap简单的使用1、创建Unity工程2、Tilemap的使用2.1、导入素材图片2.2、切割图片2.3、创建画板2.4、创建瓦片2.5、创建网格2.6、在网格上刷瓦片2.7、解决瓦片没有占满格子的问题2.8、解决瓦片之间有缝隙的问题2.9、擦除瓦片2.10、区域瓦片绘制2.11、瓦…

适合上班族做的4个低门槛的副业兼职

对于大多数职场中人来说&#xff0c;如果没有在30岁之后获得晋升&#xff0c;获得更好的发展平台&#xff0c;可能就会感到工作缺乏足够的吸引力了。当我们只有一份工作的时候&#xff0c;就好比把鸡蛋放在一个篮子里&#xff0c;把自己的青春放在一家公司里。这也就好比单一的…

华盛顿大学Baker实验室率先设计出双稳态结构蛋白质

在蛋白质世界&#xff0c;“结构决定功能”是一条基本原则。因此&#xff0c;很多人可能认为&#xff0c;一个蛋白质就应该有一个唯一确定的结构&#xff0c;使得它能够去执行确定的生物学功能。其实&#xff0c;在真实的世界中&#xff0c;蛋白质大多都是处于一种不断起伏的动…

MongDB【CRUD练习-条件查询-文档关系】

练习1-CRUD // 进入test数据库 use test; // 查询文档内容 db.students.find(); // 显示当前数据库中所有集合 show collections; // 向数据库的user集合中插入一个文档 db.users.insertOne({username: "lyh"} ); // 查看当前数据库中所有的集合 发现users集合被创建…

信号处理--基于EEG脑电信号的眼睛状态的分析

本实验为生物信息学专题设计小项目。项目目的是通过提供的14导联EEG 脑电信号&#xff0c;实现对于人体睁眼和闭眼两个状态的数据分类分析。每个脑电信号的时长大约为117秒。 目录 加载相关的库函数 读取脑电信号数据并查看数据的属性 绘制脑电多通道连接矩阵 绘制两类数据…

《强化学习:原理与Python实战》——可曾听闻RLHF

前言&#xff1a; RLHF&#xff08;Reinforcement Learning with Human Feedback&#xff0c;人类反馈强化学习&#xff09;是一种基于强化学习的算法&#xff0c;通过结合人类专家的知识和经验来优化智能体的学习效果。它不仅考虑智能体的行为奖励&#xff0c;还融合了人类专家…

LeetCode算法递归类—二叉树的右视图

目录 199. 二叉树的右视图 题解&#xff1a; 目标&#xff1a; 思路&#xff1a; 过程&#xff1a; 代码&#xff1a; 运行结果&#xff1a; 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所…

使用渲染纹理(RenderTexture)来实现3D视觉

如上图的效果&#xff0c;使用2D场景&#xff0c;通过摄像头的改动&#xff0c;使其看起来像是3D效果一样。 Nintendo Switch上刚推出的《超级马里奥》中&#xff0c;有一些关卡混合了2D和3D的画面&#xff0c; 一般来说&#xff0c;摄像机会直接渲染到电脑屏幕&#xff1b;…

【C语言练习】数组OJ题

目录 一.消失的数字思路1&#xff1a;思路2&#xff1a; 二.移除元素三.轮转数组四.删除有序数组中的重复项五.合并两个有序数组 一.消失的数字 题目&#xff1a; 思路1&#xff1a; 数组是从0加到N&#xff0c;所以把0到N的数加起来减去数组中的值&#xff0c;结果就是消失…