Flask框架【before_first_request和before_request详解、钩子函数、Flask_信号机制】(七)

这篇具有很好参考价值的文章主要介绍了Flask框架【before_first_request和before_request详解、钩子函数、Flask_信号机制】(七)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

request,Python框架入门到实战,flask,python,后端

👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白
📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
🍂博主正在努力完成2023计划中:以梦为马,扬帆起航,2023追梦人

🔥🔥🔥 python入门到实战专栏:从入门到实战 

🔥🔥🔥 Python爬虫开发专栏:从入门到实战

🔥🔥🔥 Python办公自动化专栏:从入门到实战

🔥🔥🔥 Python数据分析专栏:从入门到实战

🔥🔥🔥 Python前后端开发专栏:从入门到实战

文章目录

before_first_request和before_request详解

钩子函数context_processor详解

钩子函数errorhandler详解

Flask_信号机制

Flask信号使用场景_存储用户登录日志

Flask_内置信号


before_first_request和before_request详解

request,Python框架入门到实战,flask,python,后端

before_first_request:处理项目的第一次请求之前执行。

from flask import Flask,request

app = Flask(__name__)

@app.route('/')
def hello_world():
    print("hi")
    return "hello world "

@app.before_first_request
def first_request():
    print('hello world')

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

before_request:在每次请求之前执行。通常可以用这个装饰器来给视图函数增加一些变量。

请求已经到达了Flask,但是还没有进入到具体的视图函数之前调用。


一般这个就是在视图函数之前,我们可以把一些后面需要用到的数据先处理好,方便视图函数使用。

from flask import Flask,g,session

app = Flask(__name__)
app.config['SECRET_KEY'] = 'skidhfikshighsd'

@app.route('/login/')
def login():
    print('运行代码 222222222')
    print('Hello!!!!')
    session['uname'] = '吕布'
    return f'Hello'

@app.route('/home/')
def home():
    print('运行代码 3333333333')
    if hasattr(g, 'uname'):
        return f'用户已登录!用户名是:{g.uname}'
    return '用户没有登录!'

@app.before_request
def before_request():
    print('运行代码 111111111111')
    uname = session.get('uname')
    if uname:
        g.uname = uname
    print('这个是每次请求时,需要执行的逻辑!!!')

# 需求: 判断用户是否登录,如果登录了,就返回用户的信息,如果没有登录就返回None


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

钩子函数context_processor详解

request,Python框架入门到实战,flask,python,后端

context_processor:上下文处理器。使用这个钩子函数,必须返回一个字典。这个字典中的值在所有模版中都可以使用。

使用场景
这个钩子函数的功能是,如果一些在很多模版中都要用到的变量,那么就可以使用这个钩子函数来返回,而不用在每个视图函数中的 render_template 中去写,这样可以让代码更加简洁和好维护。

from flask import
Flask,request,session,current_app,url_for,g,
render_template
import os

app = Flask(__name__)
app.config['SECRET_KEY']=os.urandom(24)  #加盐 混淆原数据的作用

@app.route('/')
def hello_world():
    print("hi")
    session['uname']="sxt"
    # return "hello world "
    return  render_template("index.html")

@app.route('/li')
def mylist():
    print("mylist")
    # print("直接取出",g.user)
    if hasattr(g,"user"):
        print("条件取出", g.user)
    # return "hello world "
    return render_template('list.html')

@app.before_request
def before_request():
    # print('在视图函数执行之前执行的钩子函数')
    # 场景:若用户已经登录了,验证时把用户名放入session中,之后取出来,放入钩子函数,以后访问的视图函数中可直接取出来使用
   uname = session.get('uname')
   print(uname)
   if uname:
       g.user = uname

@app.context_processor
def context_processor():
    if hasattr(g,'user'):
        return {"current_user":g.user}
    else:
        return {}

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

钩子函数errorhandler详解

request,Python框架入门到实战,flask,python,后端

errorhandler:
在发生一些异常的时候,比如404错误,比如500错误, 那么如果想要优雅的处理这些错误,就可以使用 errorhandler 来出来。

需要注意几点:
1、在errorhandler装饰的钩子函数下,记得要返回相应的状态码。
2、在errorhandler装饰的钩子函数中,必须要写一个参数,来接收错误的信息,如果没有参数,就会直接报错。

3、使用 flask.abort 可以手动的抛出相应的错误,比如开发者在发现参数不正确的时候可以自己手动的抛出一个400错误。

常见的500错误处理

from flask import
Flask,g,render_template,abort

app =Flask(__name__)

@app.route('/')
def index():
    print(g.uname)
    return 'Hello!'

@app.errorhandler(500)
def server_error(error): # server_error()
takes 0 positional arguments but 1 was given
    return render_template('500.html'),500 #状态码虽然可以不写,但是推荐写上,这样可以告诉服务器是哪个错误
    # return render_template('500.html')

if __name__ =="__main__":
    # app.run(debug=True)
    app.run()

常见的404错误处理

from flask import
Flask,g,render_template,abort

app =Flask(__name__)

@app.route('/')
def index():
    print(g.uname)
    return 'Hello!'

@app.errorhandler(404)
def server_error(error):
    return render_template('404.html'),404

if __name__ =="__main__":
    # app.run(debug=True)
    app.run()

Flask中的abort函数可以手动的抛出相应的错误(如400)

from flask import
Flask,g,render_template,abort

app =Flask(__name__)

@app.route('/')
def index():
    print(g.uname)
    return 'Hello!'

@app.errorhandler(404)
def server_error(error):
    return render_template('404.html'),404

@app.route('/home/')
def home():
    abort(404)

if __name__ =="__main__":
    # app.run(debug=True)
    app.run()


Flask_信号机制

request,Python框架入门到实战,flask,python,后端

信号机制

大白话来说,类似于两方属于敌对关系时,某人在敌对方阵营进行交谈,一旦遇到特殊情况,某人便会发送信号,他的同伙接收(监听)到他发的信号后,同伙便会做出一系列的应对策略(进攻|撤
退)。
 flask中的信号使用的是一个第三方插件,叫做blinker。通过piplist看一下,如果没有安装,通过以下命令即可安装blinker

pip install blinker

自定义信号步骤

自定义信号可分为3步来完成。

第一是创建一个信号,第二是监听一个信号,第三是发送一个信号。

以下将对这三步进行讲解:

创建信号:定义信号需要使用到blinker这个包的Namespace类来创建一个命名空间。比如定义一
个在访问了某个视图函数的时候的信号。示例代码如下:

# Namespace的作用:为了防止多人开发的时候,信号名字冲突的问题
from blinker import Namespace
mysignal = Namespace()
signal1 = mysignal.signal('信号名称')

监听信号:监听信号使用signal1对象的connect方法,在这个方法中需要传递一个函数,用来监听
到这个信号后做该做的事情。示例代码如下:

def func1(sender,uname):
    print(sender)
    print(uname)
signal1.connect(func1)

发送信号:发送信号使用signal1对象的send方法,这个方法可以传递一些其他参数过去。示例代码如下:

signal1.send(uname='momo')

代码演示

from flask import Flask
from blinker import Namespace
app = Flask(__name__)

#【1】信号机制   3步走
# Namespace:命名空间
#1.定义信号
sSpace = Namespace()
fire_signal = sSpace.signal('发送信号火箭')

#2.监听信号
def fire_play(sender):
    print(sender)
    print("start play")
fire_signal.connect(fire_play)

#3.发送一个信号
fire_signal.send()

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

Flask信号使用场景_存储用户登录日志

request,Python框架入门到实战,flask,python,后端

信号使用场景
 定义一个登录的信号,以后用户登录进来以后
 就发送一个登录信号,然后能够监听这个信号
 在监听到这个信号以后,就记录当前这个用户登录的信息
 用信号的方式,记录用户的登录信息即登录日志

编写一个signals.py文件创建登录信号

from blinker  import  Namespace
from datetime import datetime
from flask import request,g

namespace = Namespace()

#创建登录信号
login_signal = namespace.signal('login')

def login_log(sender):
    # 用户名 登录时间 ip地址
    now = datetime.now()
    ip = request.remote_addr
    log_data = "{uname}*{now}*{ip}".format(uname=g.uname, now=now, ip=ip)
    with open('login_log.txt','a') as f:
        f.write(log_data + "\n")
        f.close()

#监听信号
login_signal.connect(login_log)

使用信号存储用户登录日志

from flask import Flask,request,g

from signals import  login_signal
app = Flask(__name__)

@app.route('/login/')
def login():
    # 通过查询字符串的形式来传递uname这个参数
    uname = request.args.get('uname')
    if uname:
        g.uname = uname
        # 发送信号
        login_signal.send()
        return '登录成功!'
    else:
        return '请输入用户名!'

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

Flask_内置信号

request,Python框架入门到实战,flask,python,后端

Flask内置了10个常用的信号

1、 template_rendered:模版渲染完成后的信号。

2、 before_render_template:模版渲染之前的信号。

3、 request_started:请求开始之前,在到达视图函数之前发送信号。

4、 request_finished:请求结束时,在响应发送给客户端之前发送信号。

5、request_tearing_down:请求对象被销毁时发送的信号,即使在请求过程中发生异常也会发送信号。
6、got_request_exception:在请求过程中抛出异常时发送信号,异常本身会通过exception传递到订阅(监听)的函数中。一般可以监听这个信号,来记录网站异常信息。

7、appcontext_tearing_down:应用上下文被销毁时发送的信号。

8、appcontext_pushed:应用上下文被推入到栈上时发送的信号。

9、appcontext_popped:应用上下文被推出栈时发送的信号。

10、message_flashed:调用了Flask的 flash 方法时发送的信号。

template_rendered的使用

from flask import
Flask,render_template,template_rendered

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello!!'

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

def
render_function(sender,template,context):
    print(sender)
    print(template)
    print(context)

template_rendered.connect(render_function)

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


got_request_exception的使用文章来源地址https://www.toymoban.com/news/detail-730260.html

from flask import
Flask,request,got_request_exception,render_template

app = Flask(__name__)
#内置信号
#got_request_exception:在请求过程中抛出异常时发送信号,异常本身会通过exception传递到订阅(监听)的函数中。
# 一般可以监听这个信号,来记录网站异常信息。
# def
request_exception_log(sender,*args,**kwargs)
: #掌握写参数技巧
#     print(sender)
#     print(args)
#     print(kwargs)

def request_exception_log(sender,exception):
    print(sender)
    print(exception) # division by zero

got_request_exception.connect(request_exception_log)

@app.route('/')
def hello_world():
    #制造bug
    a = 1/0
    return
render_template("index.html",data="momo")

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


到了这里,关于Flask框架【before_first_request和before_request详解、钩子函数、Flask_信号机制】(七)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Flask.Request的方法和属性,获取get和post请求参数(二)

    在Python发送Post、Get等请求时,我们使用到requests库。Flask中有一个request库,有其特有的一些方法和属性,注意跟requests不是同一个。 用于服务端获取客户端请求数据。注意:是未经任何处理的原始数据而不管内容类型,如果数据时json的,则取得是json字符串,排序和请求参数

    2024年02月13日
    浏览(45)
  • Python爬虫技术系列-03/4flask结合requests测试静态页面和动态页面抓取

    flask内容参考:Flask框架入门教程(非常详细) 安装flask 创建一个webapp.py文件,内容如下 运行代码 终端输出如下: 在浏览器输入 返回如下 创建webapp_html_str.py文件,代码如下: 运行 运行代码 在浏览器输入 返回如下 返回一个静态html页面 在工程目录下,创建一个templates目录,在

    2024年02月04日
    浏览(45)
  • ImportError: cannot import name ‘_request_ctx_stack‘ from ‘flask‘

    flask版本:3.0.0 修改 [你的虚拟环境]Libsite-packagesflask_scriptcommands.py from flask import _request_ctx_stack 改为 from flask import request_ctx 修改 [你的虚拟环境]Libsite-packagesflask_ init _.py 导入 from .globals import _no_app_msg, request_ctx

    2024年01月20日
    浏览(46)
  • 【已解决】Flask项目报错AttributeError: ‘Request‘ object has no attribute ‘is_xhr‘

    报错代码 分析 这个问题是后端代码中的问题。 根据错误日志, \\\'Request\\\' 对象没有属性 \\\'is_xhr\\\' 。这是因为在较新的 Flask 版本中, \\\'is_xhr\\\' 属性已被废弃。为了解决这个问题,可以使用 \\\'is_ajax\\\' 属性来代替 \\\'is_xhr\\\' 。 可以将代码中的 not request.is_xhr 改为 not request.is_ajax ,这样应该

    2024年02月16日
    浏览(44)
  • Flask框架-配置日志(1):flask使用日志

    study_flask         --| apps/                 --| __init__.py         --| base/                 --| logger.py                 --| __init__.py         --| app.py 1、base/logger.py 2、apps/__init__.py 1、在视图中使用 2、在视图中抛出一个异常 基于文件大小分割的日志文件

    2024年02月12日
    浏览(51)
  • Flask 是什么?Flask框架详解及实践指南

    Flask 是一个轻量级的 Python Web 框架,它被广泛用于构建 Web 应用程序和  API 。Flask 简单易用,具有灵活性和可扩展性,是许多开发者喜欢用其构建项目的原因。本文将介绍 Flask 是什么以及如何使用它来构建 Web 应用程序,同时提供一个实践案例,让你能够在 IDE 编辑器中运行

    2024年02月14日
    浏览(34)
  • Flask框架-流量控制:flask-limiter的使用

    flask1.x.x版本,使用flask-limiter=1.4.0版本的。 ext/__init__.py apps/__init__.py 频率限制语法: 1、\\\'100 per day\\\'、\\\'20 per hour\\\'、\\\'5 per minute\\\'、\\\'1 per second\\\' 2、\\\'100/day\\\'、\\\'20/hour\\\'、\\\'5/minute\\\'、\\\'1/second\\\'    #推荐这个,看起来简单 FBV使用 CBV使用 在很多时候,我们不仅仅需要对IP进行流量控制,可能需

    2024年02月14日
    浏览(31)
  • 【Python Flask/postman:request中post的header:Content-type=“text/plain”报错及解决方法】

    python Flask构建restful API接口服务,通过postman进行接口服务验证测试 提示:这里描述项目中遇到的问题: 验证接口调用text/plain时出现报错 源代码(错误): 报错1: TypeError: ‘bytes’ object is not callable 报错1原因: 类中函数名或者变量名重用(即变量名和函数名有重复) 根据

    2023年04月08日
    浏览(52)
  • Flask 框架集成Bootstrap

    前面学习了 Flask 框架的基本用法,以及模板引擎 Jinja2,按理说可以开始自己的 Web 之旅了,不过在启程之前,还有个重要的武器需要了解一下,就是著名的 Bootstrap 框架和 Flask 的结合,这将大大提高开发 Web 应用的效率。 Bootstrap 是 Twitter 公司的设计师 Mark Otto 和 Jacob Thornto

    2024年02月13日
    浏览(44)
  • Flask框架上传和下载文件

    上传文件步骤 : 1. 在模版html中,表单需要指定 enctype=\\\'multipart/form-data\\\' 才能上传文件。 2. 在后台如果想要获取上传的文件,那么应该使用 request.files.get(\\\'文件名\\\') 来获取。 3. 保存文件之前,先要使用 werkzeug.utils.secure_filename 来对上传上来的文件名进行一个过滤。能保证不会有

    2024年02月02日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包