flask学习记录05-flask中的请求钩子

图片

这节是flask-视图函数及路由模块的最后一个章节,下一节将开始记录flask-模块相关的知识。

请求钩子的作用

请求钩子是通过装饰器的形式实现的,其目的就是避免写重复的代码.

在客户端和服务器交互的过程中,做些准备工作和扫尾工作.

flask中有哪些装饰器

  • before_first_request

  • before_request

  • after_request

  • teardown_request

请求钩子该如何使用

before_first_request
  • 处理第一个请求前执行

  • 只执行一次

  • 不能拦截第一次请求的执行

写一个实例,来看下before_first_request,该怎么用

图片

可以看到before_first_request只执行一次,且在第一个请求前进行执行,我们分析下它在浏览器中的执行过程

图片

before_request
  • 在每次请求前都执行

  • 对应的函数如果返回一个响应,视图函数不被调用

写一个实例来看下before_request怎么用

图片

可以看到它每次都会执行,如果返回响应,函数就不被调用了

图片

基于这个特性,我们是不是可以在对应的函数中,在请求开始之前,做一些处理。

比如典型的需求,对一些非法的请求进行拦截.我们可以在before_request请求钩子对应的函数中,写个if语句判断ip是否在黑名单里,如果在直接返回提示信息

after_request
  • 必须接收一个response对象

  • 必须返回一个response对象

  • 对应的函数中可以对response对象进行处理

写一个实例来看下after_request怎么用,发现页面报错了

图片

看样子是缺少一个参数,我们查询源码看下

图片

原来忘记接收和返回response返回对象了,我们加入看下,是不是可以了

图片

teardown_request
  • 每次请求执行之后

  • 必须接收一个error对象

  • 如果请求异常,对应的函数可捕获具体异常

写一个实例来看下teardown_request怎么用,发现页面又报错了

图片

看样子,还是缺少一个参数,我们继续看下源码要求的参数

图片

原来必须接收一个error对象,我们添加参数,发现已经成功了

图片

请求钩子在项目中有很大的用处,这里只是一些简单的入门操作,后续在项目中可以具体应用

要实现这个功能,你可以在后端代码中对未登录用户进行拦截,并将其重定向到登录页面。具体方法可以使用中间件来实现,在 Flask 中,你可以使用 Flask-Login 插件提供的 login_required 装饰器来实现拦截未登录用户的功能。 以下是一个简单的 Flask-Login 实现方式: ```python from flask import redirect, url_for from flask_login import login_required @app.before_request @login_required def before_request(): pass ``` 在这个例子中,我们使用了 Flask 的 before_request 钩子函数,该函数会在每个请求到达应用程序之前被调用。同时,我们使用了 Flask-Login 插件提供的 login_required 装饰器,该装饰器会检查用户是否已经登录,如果未登录,则会将用户重定向到登录页面。 你需要在 Flask 中配置登录视图和登录路由,以便用户可以进行登录操作。在登录视图中,你需要设置用户的登录状态,例如: ```python from flask import render_template, request, redirect, url_for from flask_login import login_user from models import User @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] user = User.query.filter_by(username=username).first() if user is not None and user.verify_password(password): login_user(user) # 设置用户的登录状态 return redirect(url_for('index')) flash('Invalid username or password.') return render_template('login.html') ``` 在这个例子中,我们从表单中获取用户名和密码,然后使用查询语句从数据库中查找用户。如果用户存在且密码验证通过,我们使用 Flask-Login 提供的 login_user 函数设置用户的登录状态。 最后,你需要在 Flask 中配置登录页面视图和路由,例如: ```python from flask import render_template @app.route('/login') def login(): return render_template('login.html') ``` 在这个例子中,我们使用 Flask 提供的 render_template 函数来渲染登录页面模板。 这样,未登录用户访问管理系统的任何页面时,都会被重定向到登录页面,直到用户进行登录操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦途的测开笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值