上下文: 相当于一个容器,保存了Flask程序中运行过程中的一些信息

上下文包括:请求上下文、应用上下文

  • 请求上下文:request、session
  • 应用上下文:跟请求没有关系,current_app,g(对象)

g对象: g对象是一个空对象,一般会动态增加属性,来实现多个函数之间的传参

请求上下文和应用上下文的区别: 请求上下文是保存客户端和服务器交互的数据,应用上下文是在Flask应用程序运行过程中,保存一些配置信息如:程序名、数据库连接、应用信息等。

在django中,每个视图函数都会传入一个request对象,如:def register(request):…这里的request是一个局部变量,每个用户发送请求时,request都会不一样,所以利用request.POST.get(“xx”)、request.POST.get(“xx”)获得的参数都是每个用户的相互之间不会干扰。

在Flask中,request是一个全局变量,from flask import request,为了让不同的用户访问同一个视图,返回各自的数据,这里使用线程id区别不同的request。其原理如下图:

from flask import Flask, gapp = Flask(__name__)@app.route("/")
def index():# g保存的是当前请求的全局变量,不同的请求会有不同的全局变量,通过线程id区别g.name = "zhangsan"say_hello()return "index page"def say_hello():name = g.nameprint(f"Hello {name}")if __name__ == '__main__':app.run()

运行结果:

请求钩子: 在客户端和服务器之间记性交互的过程中,有些准备工作和扫尾工作需要处理,比如:在请求开始的时候,建立数据库连接,在请求结束的时候指定数据交互的格式,为了让每个视图函数避免编写重复的功能代码,Flask提供了通用设施的过程,即__请求钩子__。

请求钩子是通过装饰器的形式实现的,Flask支持四中请求钩子:

  • 1、app.before_first_request:在处理第一个请求前运行
  • 2、app.before_request:在每次请求之前运行
  • 3、app.after_request:如果没有未处理的异常抛出,在每次请求后运行(视图函数正常退出)
  • 4、app.teardown_request:每次请求后运行,即使有未处理的异常抛出

请求钩子与django中的中间件很类似。

from flask import Flask, request, url_for, abortapp = Flask(__name__)@app.route("/index")
def index():print("index page is running")a = 1 / 0return "Index page"@app.route("/hello")
def hello():print("hello page is running")return "Hello page"@app.before_first_request
def handle_before_first_request():# 在第一次请求处理之前先执行print("handle_before_first_request is running")@app.before_request
def handle_before_request():# 在每次请求处理之前被执行print("handle_before_request is running")@app.after_request
def handle_after_request(response):# 在每次请求(视图函数)处理之后都被执行,前提是视图函数没有异常# 在请求之后,会接收一个参数,这个参数是前面的请求处理完毕后返回# 的响应数据,如果需要对响应做额外处理,可以在这里进行print(f"handle_after_request is running, the response is {response}")return response@app.teardown_request
def handle_teardown_request(response):# 在每次请求(视图函数)处理之后都会被执行,无论视图函数是否异常# 每一次请求之后都会调用,会接收一个参数,这个参数是服务器出现的# 错误信息,工作在非调试模式下,当时图函数出现异常时,才会被执行print(f"handle_teardown_request is running, the response is {response}")if request.path == url_for("index"):print("在请求钩子中判断请求的视图逻辑:index")elif request.path == url_for("hello"):print("在请求钩子中判断请求的视图逻辑:hello")return responseif __name__ == '__main__':app.run()

运行结果如下:
1、当视图函数没有抛出异常时,运行结果如下:

2、当视图函数执行出错时:

flak_script脚本扩展的使用:

导包:

  • from flask_script import Manager

使用:

  • 1、创建Manager对象,把当前的flask应用传入Manager类中
    manager = Manager(app)
  • 2、使用管理类来启动flask
    manager.run()

在终端中使用:python 文件名.py --help 查看可用的命令:

  • python 文件名.py runserver 启动服务器
  • python 文件名.py runserver --help 查看可用命令
  • python 文件名.py runserver -h IP地址 -p 端口号 指定ip端口号启动
  • python 文件名.py shell 在这个shell终端中文件里的包已经全部导进来了,不需要在重新导入了
from flask import Flask
from flask_script import Managerapp = Flask(__name__)
manager = Manager(app)@app.route("/index")
def index():return "Index page"if __name__ == '__main__':manager.run()

渲染模板

在Flask中使用render_template渲染模板

模板变量与django中类似,其中操作字典有两种方式:{{my_dict.键名}}或{{my_dict[“键名”]}}

render_template(“需要渲染的模板.html”, xx=value, xxx=value, …) 其中value可以是字典、列表、int、str…

过滤器(支持链式使用过滤器):

  • 1、字符串过滤器:

    • 1-1、safe:禁止转义
    • 1-2、capitalize:把变量值的首字母转换成大写,其余字母转小写
    • 1-3、lower:把变量值转换成小写
    • 1-4、upper:把变量值转换成大写
    • 1-5、title:把变量值中的每个词的首字母转换成大写
    • 1-6、trim:把变量值的首尾空格去掉
    • 1-7、reverse:字符串翻转 --> hello–olleh
    • 1-8、format:格式化数据 --> {{ ‘%s is %d’ | format(‘name’, 18) }}
    • 1-9、striptags:渲染之前把变量值中所有的HTML标签都删掉
  • 2、列表过滤器:
    • 2-1、first:取第一个元素
    • 2-2、last:取最后一个元素
    • 2-3、length:获取列表长度
    • 2-4、sum:列表求和
    • 2-5、sort:列表排序
  • 3、自定义过滤器:自定义的过滤器名称如果与内置的过滤器重名,会覆盖掉内置的过滤器,自定义过滤器有两种方式。
    • 方式一:

      • 1)定义一个过滤器函数
      • 2)使用app.add_template_filter(自定义过滤器的函数名, 过滤器名(自己取的名,不传这个参数,默认函数名))
    • 方式二:使用装饰器装饰自定义的过滤器函数
@app.template_filter("过滤器名")  # 如果不传过滤器名,默认函数名
def 自定义的过滤器函数:...
from flask import Flask, render_templateapp = Flask(__name__)# 渲染模板
@app.route("/test")
def test():data = {"name": "zhaosi","age": 20,"my_dict": {"city": "beijing"},"my_list": [1, 2, 3, 4, 5, 6, 7],"my_int": 3}return render_template("test.html", **data)# 自定义过滤器
# 方式一
def li_step_1(li):# 列表元素隔一个取一个return li[::2]
app.add_template_filter(li_step_1, "li_1")# 方式二
@app.template_filter("li_2")
def li_step_2(li):# 列表元素各两个取一个return li[::3]if __name__ == '__main__':app.run()# html文件
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>模板</title></head><body><p>name:{{ name }}</p><p>age:{{ age }}</p><p>字典类型数据:</p><p>my_dict: city:{{ my_dict.city }}</p><p>my_dict: city:{{ my_dict["city"] }}</p><p>列表类型数据:</p><p>my_list:{{ my_list }}</p><p>int类型数据:</p><p>my_int:{{ my_int }}</p><p>my_list[my_int]:{{ my_list[my_int] }}</p><p>模板变量相加减</p><p>my_list[0] + my_list[1] = {{ my_list[0] + my_list[1] }}</p><p>字符串变量相加</p><p>name + city = {{ name + my_dict["city"] }}</p><p>过滤器的使用,支持链式操作,即:xxx|过滤器1|过滤器2|...</p><p>‘  hello flask  ’去首尾空格,并首字母大写:{{ "  hello flask  "|trim|title }}</p><p>自定义的转换器的使用:</p><p>列表元素隔一个取一个:{{ my_list|li_1 }}</p><p>列表元素隔两个取一个:{{ my_list|li_2 }}</p></body>
</html>

运行结果:

xss攻击
xss攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列表,然后向联系人发送虚假信息,可以删除用户的日志等等,有时候还和其他攻击方式同时实施比如SQL注入攻击服务器和数据库、Click劫持、相对链接劫持等实施钓鱼,它带来的危害是巨大的,是web安全的头号大敌。

XSS攻击是在用户的浏览器上执行的,其形成过程则是在服务器端页面渲染时,注入了恶意的HTML代码导致的。

from flask import Flask, request, render_templateapp = Flask(__name__)@app.route("/xss", methods={"GET", "POST"})
def xss():text = ""if request.method == "POST":text = request.form.get("text")return render_template("xss攻击.html", text=text)if __name__ == '__main__':app.run()# html文件
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>XSS攻击</title></head><body><form method="post"><textarea name="text"></textarea><input type="submit" value="提交"></form>{# 转义:默认是开启转义的,即:你输入什么,最后返回什么,这是为了防止xss攻击 #}{#比如:输入<script>alert("xss attack")</script>转义成html语言后为: &lt;script&gt;alert(&#34;xss attack")&lt;/script&gt;那么在浏览器中显示也是:<script>alert("xss attack")</script>#}{{ text }}  {# 默认是开启转义了,渲染模板时,执行的是 &lt;script&gt;alert("xss attack")&lt;/script&gt; #}{{ text|safe }} {# 关闭转义,渲染模板时,执行的是 <script>alert("xss attack")</script> ,这是就会出现一个弹窗 #}</body>
</html>

Flask—上下文、g对象、请求钩子、flask_script脚本扩展、渲染模板、过滤器相关推荐

  1. Flask框架(flask中的请求上下文和应用上下文,以及请求钩子的使用,Flask-Script 扩展命令行)

    1.请求上下文与应用上下文 请求上下文(request context) request和session都属于请求上下文对象. 应用上下文(application context) current_a ...

  2. 【flask入门系列】请求钩子与上下文

  3. Flask框架——请求钩子与request请求对象

    目录 请求钩子 request对象 请求钩子 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: 在请求开始时,建立数据库连接 在请求开始时,根据需求进行权限校验 在请求结束时,指定 ...

  4. Web框架——Flask系列之请求上下文与应用上下文请求钩子Flask-Script扩展命令行(十七)

    一.请求上下文和应用上下文 请求上下文(request context) request和session都属于请求上下文对象. 应用上下文(application context) current_a ...

  5. Flask 中的上下文管理和请求钩子

    Flask 中的上下文管理和请求钩子 在使用 Flask 框架实现功能接口的时候,前端点击按钮发送请求的请求方式和 form 表单提交给后端的数据,后端都是通过 Flask 中的 request 对象 ...

  6. Flask中current_app和g对象

    Flask中有两种上下文,请求上下文和应用上下文. 请求上下文(request context) request和session都属于请求上下文对象. request:封装了HTTP请求的内容,针对的 ...

  7. Flask之请求钩子

    请求钩子 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: 在请求开始时,建立数据库连接: 在请求开始时,根据需求进行权限校验: 在请求结束时,指定数据的交互格式: 为了让每个视图 ...

  8. 【Flask】项目中使用请求钩子的妙处有那些?

    在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: 在请求开始时,建立数据库连接: 在请求开始时,根据需求进行权限校验: 在请求结束时,指定数据的交互格式: 为了让每个视图函数避免编 ...

  9. 【Flask】在g对象中存放List,实现在捕获异常后继续执行for循环

    目的 在捕获异常后,本层先不处理,但希望能够继续执行for循环,所以也不能继续抛出新的异常 于是使用flask提供的'g'对象,存储所有的异常内容(可以经过自定义数据格式封装,本例使用List存放发生 ...

  10. Flask学习笔记之g对象

    ### 保存全局变量的g属性: g:global 1. g对象是专门用来保存用户的数据的. 2. g对象在一次请求中的所有的代码的地方,都是可以使用的.

最新文章

  1. 一图看清全球270家典型区块链服务商
  2. i.MX6 u-boot 怎么确定板级头文件
  3. 【计算理论】非确定性有限自动机 ( 计算过程 | 计算树 | 确定可接受字符串 | 设计非确定性有限自动机 | 空字符 )
  4. android使用桢布局,Android性能优化UI篇
  5. HTTP缓存详解之etag
  6. linux命令解释程序实验,实验二 命令解释程序的使用
  7. Java面试知识点:Object类、Math类、BigDecimal类、自动装箱、拆箱
  8. TensorFlow构建二维数据拟合模型(2)
  9. 关于产品与数据该如何结合的一点想法(一)
  10. EasyUI:datagrid重置排序按钮状态
  11. WinRAR 5.21 32位+64位 烈火中文美化破解版(最流行的压缩解压工具)
  12. 2022电大国家开放大学网上形考任务-电子商务概论非免费(非答案)
  13. C语言中sprintf()函数的用法
  14. Java jdk的下载与安装
  15. svn图标消失解决办法
  16. Java实现数字大写
  17. 两小时从零学会vue-admin-template框架
  18. ⽤户去输⼊⼀个⼈民币⾦额,然后程序会计算如何去⽤20元纸币,10元纸币,5元纸币和⼀元纸币去表⽰这个⼈民币⾦额。要求使⽤最⼩数⽬的纸币。
  19. android 预览和拍照成像方向不一致,android 拍照 预览图与 照片分辨率(可视区域)不一致...
  20. MATLAB中Simulink创建与运行

热门文章

  1. MCGS屏幕程序 包含图纸,程序,为锅炉系统,含有整套系统架 MCGS屏幕程序 包含CAD图纸,西门子PLC程序和昆仑通态MCGS触摸屏程序,为锅炉系统,含有整套系统
  2. python心脏线绘制代码_用python绘制爱心的基本步骤
  3. ICDM 2014 Paper ShellMiner Mining Organizational Phrases in Argumentative Texts in Social Media
  4. 计组期末复习之名词解释
  5. ubuntu18.04双系统息屏或合上笔记本盖子后无法唤醒
  6. python opencv 识别指示灯
  7. Reverse Unreal Shader memorandum
  8. iOS工作记录11:提现功能 绑定淘宝账号功能
  9. 解决进入NVIDIA控制面板管理3D设置闪退问题办法
  10. 知名饮料品牌,是如何在海报应用二维码来促进产品销量提升的?