首页 > 其他分享 >flask 路由请求扩展

flask 路由请求扩展

时间:2024-09-14 16:46:07浏览次数:11  
标签:return 请求 flask app after request 路由 response def

一、钩子函数

 1、@app.before_request 和 @app.after_request

from flask import Flask

app = Flask(__name__)


@app.before_request
def before1():
    print('before1')


@app.before_request
def before2():
    print('before2')
    return '第二个返回了'


@app.before_request
def before3():
    print('before3')


@app.after_request
def after1(response):
    print('after1')
    return response


@app.after_request
def after2(response):
    print('after2')
    return response


@app.after_request
def after3(response):
    print('after3')
    return response


@app.route('/')
def index():  # put application's code here
    return '返回了'


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

结果 :

before_request: 一旦返回了有效值,则后续的 @app.before_request 和视图函数将不在执行,这里 before3() 和  index() 不再执行

after_request:在视图函数处理完成并生成响应后,从下往上依次执行所有的 after_request 函数。这个流程不会中断,所以所有的 after_request 函数都会执行。

2、before_request 的使用场景

before_request 钩子函数在每个请求到达视图函数之前执行。这允许在正式处理请求之前进行一些预处理操作。以下是一些常见的使用场景:

2.1 用户认证与授权:

  在访问任何受保护的路由之前检查用户是否已登录。

  校验用户是否有权限访问特定资源。

@app.before_request
def check_authentication():
    if not is_user_authenticated():
        return redirect('/login')

2.2  初始化上下文和资源:

在每个请求开始时,初始化一些全局变量、数据库连接或其他资源。

@app.before_request
def initialize_globals():
    g.some_data = load_some_data()

2.3 记录请求的信息用于审计或分析

@app.before_request
def log_request_info():
    print(f'Handling request for {request.path}')

2.4 防止CSRF攻击:

验证请求中的CSRF令牌,确保请求是从可信来源发出的。

@app.before_request
def protect_from_csrf():
    if request.method == "POST":
        token = request.form.get('csrf_token')
        if not token or token != session.get('csrf_token'):
            abort(403)

3、after_request 的使用场景

after_request 钩子函数在视图函数处理完请求后执行,允许对响应进行附加处理。这可以用来添加全局的后处理逻辑。以下是一些常见的使用场景:

3.1 修改或增强响应:

  添加或修改HTTP头

  增加默认的响应格式,如增加跨域资源共享(CORS)头

@app.after_request
def add_cors_headers(response):
    response.headers['Access-Control-Allow-Origin'] = '*'
    return response

3.2 记录响应日志:

记录响应的相关信息,用于监控或分析。

@app.after_request
def log_response_info(response):
    print(f'Returned status: {response.status}')
    return response

3.3  缓存控制:

修改响应头部以控制缓存策略

@app.after_request
def add_cache_control(response):
    if request.endpoint == 'static':
        response.headers['Cache-Control'] = 'public, max-age=31536000'
    return response

3.4  清理资源:

请求结束后进行资源的清理或释放,例如关闭数据库连接。

@app.after_request
def release_resources(response):
    close_database_connection()
    return response

3.5 安全增强:

增加安全相关的头部,如内容安全政策(Content Security Policy, CSP)。

@app.after_request
def set_security_headers(response):
    response.headers['Content-Security-Policy'] = "default-src 'self'"
    return response

4、@app.teardown_request  

@app.teardown_request
def jingzhiz(err):
    print(err)  # 每一个请求之后绑定一个函数,即使遇到了异常。如果视图函数正常顺利运行,err是None的,如果视图函数出错了,err就是错误对象,一般用来做日志记录
    print('teardown_request')

5、@app.errorhandler

@app.errorhandler(404)
def error(arg):
    print('404测试', arg)
    return render_template('404.html')

6、@app.template_global() 和  @app.template_filter() 

是Flask中用于模板处理的两个装饰器,它们可以让你在Jinja2模板中定义全局变量和自定义过滤器,帮助你更灵活地处理模板中的数据。

6.1 @app.template_global()  用于在Flask应用的模板环境中注册一个全局函数。这个函数可以在前端模板中直接调用,类似于Python中的内置函数  定义全局函数:在模板中定义一些常用的、全局可用的函数。
from flask import Flask

app = Flask(__name__)

@app.template_global()
def greet(name):
    return f"Hello, {name}!"

@app.route('/')
def index():
    return render_template('index.html')

在html 页面中使用变量

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {{ greet('World') }}    <!-- 输出:Hello, World! -->
</body>
</html> 

6.2 @app.template_filter() 用于创建自定义的Jinja2过滤器。这些过滤器可以在模板中用于格式化数据,类似于内置的过滤器(如 str.upper)。

from flask import Flask

app = Flask(__name__)

@app.template_filter()
def reverse(s):
    return s[::-1]

@app.route('/')
def index():
    return render_template('index.html')

在 index.html 模板中,该自定义过滤器可以在管道操作中使用:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {{ "Hello, World!" | reverse }}    <!-- 输出:!dlroW ,olleH -->
</body>
</html>
  • **@app.template_global()**:用于注册全局函数,便于模板随时调用。适合逻辑较复杂且在多处地方使用的操作。
  • **@app.template_filter()**:用于注册自定义过滤器,在模板中对数据进行处理。适用于需要在模板中重复使用的格式化操作。

 

标签:return,请求,flask,app,after,request,路由,response,def
From: https://www.cnblogs.com/dgp-zjz/p/18414114

相关文章

  • Vue3中路由传参的几种方式实践
    【1】RouterLink+query父组件脚本如下:<scriptsetuplang="ts"name="News">import{reactive}from'vue'import{RouterView,RouterLink}from'vue-router'constnewsList=reactive([{id:'asfdtrfay01',......
  • Vue2/Vue3中编程式路由导航实践总结
    【1】Vue2编程式路由导航①router.push除了使用<router-link>创建a标签来定义导航链接,我们还可以借助router的实例方法,通过编写代码来实现。router.push(location,onComplete?,onAbort?)注意:在Vue实例内部,你可以通过$router访问路由实例。因此你可以调用this.$router......
  • 如何避免旧请求的数据覆盖掉最新请求
    我的博客地址:如何避免旧请求的数据覆盖掉最新请求-蚊子的前端博客在检索的场景中,经常会对同一个接口发起不同的检索条件的请求,若前一个请求响应较慢时,可能会覆盖掉我们后发起请求的结果。如我们先发起一个搜索请求,参数是A;这个请求还没结束,我们发起了参数是B的搜索请求;可能......
  • 《鸿蒙/Harmony | 开发日志》请求用户权限 & 打开应用设置界面
    鸿蒙的请求用户权限相对比较好用,下面的代码,基本是来源华为官方的文档,只需要封装一下,挺好用。鸿蒙的权限分类鸿蒙的权限分为两种系统权限(直接配置文件配置申请,不需要询问用户)需要用户手动确认的权限(必须提示用户主动授权)参考:《应用权限管控概述》在配置文件中设置需要申......
  • windows路由命令
    1.ipconfig/all/renew:更新DHCP配置,重新获取IP/release:释放DHCP,重新获取IP地址/flushdns:清楚DNS缓存信息/displaydns:显示DNS缓存信息 2.traceroute:跟踪路由信息tracert 3.route print:打印路由表add:添加静态路由,重启后消失-p:与add联合使用,添加永久路由,重启......
  • 请求HTTP链接的图片等资源被自动变成HTTPS请求的问题解决(顺便可以解决图片防盗链)
    文章目录问题现象问题根本原因常规问题解决办法非Chrome浏览器:控制CSP协议对HTML页面处理nginx配置中处理Chrome浏览器本地处理方式Chrome浏览器通用解决办法(服务器端无法控制新版Chrome这种行为,只能曲线救国--顺便可以解决图片防盗链)网页的网站使用http域名代理服务......
  • SpringMvc 完整上传文件流程(Ajax请求)头像,图片上传
    1、config包下的操作1.1、创建MyWebApplicationInit类如何创建第一个SpringMvc步骤以配置类的形式代替xml文件(点击链接查看)1.2、设置文件大小(自定义)1.3、创建SpringMvcConfig类并实现WebMvcConfigurer接口@EnableWebMvcpublicclassSpringMvcConfigimplementsWeb......
  • 基于python+flask框架的进销存管理系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着企业规模的扩大与市场竞争的加剧,传统的手工管理模式已难以满足现代商业对效率与准确性的高要求。进销存管理系统作为企业管理的重要组......
  • 基于python+flask框架的资产评估系统的设计与实现(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着市场经济的快速发展与全球化进程的加速,资产评估作为连接经济交易、投资决策、财务管理的重要环节,其重要性日益凸显。传统的手工评估方......
  • 基于python+flask框架的教师档案管理系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着教育事业的蓬勃发展,教师作为教育体系的核心资源,其管理效率与质量直接关系到学校的教学水平和长远发展。传统的手工或简单的电子表格管......