Flask 中 @app.before_request、@app.after_request 和 @app.teardown_request

Flask 中 @app.before_request@app.after_request 和 @app.teardown_request

flask中又两种 context(上下文),分别是 application context 和 request context

其中 request 就是 request context。当 HTTP 请求过来的时候,进入这个上下文。

题主的那些方法都是一些 flaks 的 hooks。用于针对 request 做一些操作,比如

  • before_request :在请求收到之前绑定一个函数做一些事情。
  • after_request: 每一个请求之后绑定一个函数,如果请求没有异常。
  • teardown_request: 每一个请求之后绑定一个函数,即使遇到了异常。

至于用来干嘛?可以做很多关于request pre的事情,和request after 的事情。

比如,before_request 的时候创建一个 db 连接,然后 teardown_request 的时候断开这个连接.



Flask方法知识点收集

1.closing() ,  open_resource()

def init_db():
    with closing(connect_db()) as db:
        with app.open_resource(‘schema.sql‘) as f:
            db.cursor().executescript(f.read())
        db.commit()

closing() 助手函数允许我们在 with 块中保持数据库连接可 用。应用对象的open_resource() 方法在其方框外也支持这个 功能,因此可以在 with 块中直接使用。这个函数从资源位置(你的 flaskr 文 件夹)中打开一个文件,并且允许你读取它。

2.before_request(),  after_request(),  teardown_request(),  g 

我们知道如何在建立数据库连接并且如何执行脚本,但是我们如何能优雅的在请求 中这么做?所有的函数都需要数据库连接,所以在请求之前初始化,在请求结束后自动 关闭就很有意义。

Flask 允许我们用 before_request() 、 after_request() 和 teardown_request() 装饰器来实现这个功能:

@app.before_requestdef before_request():
    g.db = connect_db()@app.teardown_requestdef teardown_request(exception):
    g.db.close()

用 before_request() 装饰的函数会在请求前调用,它没有参 数。用 after_request()装饰的函数在请求结束后调用,需要 传入响应。它们必须返回那个响应对象或是不同的响应对象。但当异常抛出时,它们 不一定会被执行,这时可以使用teardown_request() 装饰器, 它装饰的函数将在响应构造后执行,并不允许修改请求,返回的值会被忽略。如果在 请求已经被处理的时候抛出异常,它会被传递到每个函数,否则会传入一个 None 。

我们把当前的数据库连接保存在 Flask 提供的 g 特殊对象中。这个 对象只能保存一次请求的信息,并且在每个函数里都可用。不要用其它对象来保存信 息,因为在多线程环境下将不可行。特殊的对象 g 在后台有一些神 奇的机制来保证它在做正确的事情。

3.test_request_context()

test_request_context() 方法可以用于 配合 with 声明,用于于激活一个临时的请求上下文。通过 它,您可以访问 request 、g 和 session 类的对象,就像在视图中一样。 这里有一个完整的例子示范了这种用法:

app = flask.Flask(__name__)with app.test_request_context(‘/?name=Peter‘):
    assert flask.request.path == ‘/‘
    assert flask.request.args[‘name‘] == ‘Peter‘

所有其他的访问受限的对象都可以使用同样的方法访问。

4.from_object()

在配置中使用类和继承:

class Config(object):
    DEBUG = False
    TESTING = False
    DATABASE_URI = ‘sqlite://:memory:‘class ProductionConfig(Config):
    DATABASE_URI = ‘mysql://[email protected]/foo‘class DevelopmentConfig(Config):
    DEBUG = Trueclass TestingConfig(Config):
    TESTING = True

启用这样的配置你需要调用 from_object()

app.config.from_object(‘configmodule.ProductionConfig‘)

5.Flask.instance_path()  Flask.open_instance_resource()

在 Flask 0.8 中,引入了 Flask.instance_path 并提出了“实例文件夹” 的新概念。实例文件夹被为不使用版本控制和特定的部署而设计。这是放置运行时 更改的文件和配置文件的最佳位置。

你可以在创建 Flask 应用时显式地提供实例文件夹的路径,也可以让 Flask 自 动找到它。对于显式的配置,使用 instance_path 参数:

app = Flask(__name__, instance_path=‘/path/to/instance/folder‘)

请注意给出的 一定 是绝对路径。

--------------------------------------------------------------------

实例文件夹的路径可以在 Flask.instance_path 找到。 Flask 也提供了 一个打开实例文件夹中文件的捷径,就是 Flask.open_instance_resource() 。

两者的使用示例:

filename = os.path.join(app.instance_path, ‘application.cfg‘)with open(filename) as f:
    config = f.read()# or via open_instance_resource:with app.open_instance_resource(‘application.cfg‘) as f:
    config = f.read()

6.Blueprint与构造 URL

一个蓝图可以通过 static_folder 关键字参数提供一个指向文件系统上文件夹的路 径,来暴露一个带有静态文件的文件夹。这可以是一个绝对路径,也可以是相对于蓝图 文件夹的路径:

admin = Blueprint(‘admin‘, __name__, static_folder=‘static‘)

默认情况下,路径最右边的部分就是它在 web 上所暴露的地址。因为这里这个文件夹 叫做 static ,它会在 蓝图 + /static 的位置上可用。也就是说,蓝图为 /admin 把静态文件夹注册到 /admin/static 。

最后是命名的 blueprint_name.static ,这样你可以生成它的 URL ,就像你对应用 的静态文件夹所做的那样:

url_for(‘admin.static‘, filename=‘style.css‘)

------------------------------------------

构造 URL

当你想要从一个页面链接到另一个页面,你可以像通常一个样使用 url_for() 函数,只是你要在 URL 的末端加上蓝图的名称和一个点( . )作为前缀:

url_for(‘admin.index‘)

此外,如果你在一个蓝图的视图函数或是模板中想要从链接到同一蓝图下另一个端点, 你可以通过对端点的只加上一个点作为前缀来使用相对的重定向:

url_for(‘.index‘)

这个案例中,它实际上链接到 admin.index ,假如请求被分派到任何其它的 admin 蓝图端点。

时间: 2024-10-22 04:00:19

Flask 中 @app.before_request、@app.after_request 和 @app.teardown_request的相关文章

Flask中的before_request,after_request

基础即将结束,现在抛出一个问题 现在有一个 Flask 程序其中有3个路由和视图函数,如下: from flask import Flask app = Flask(__name__) # type:Flask @app.route("/login") def login(): return "Login" @app.route("/index") def index(): return "Index" @app.route(

Flask【第九章】:特殊装饰器 @app.before_request 和 @app.after_request 以及@app.errorhandler()

特殊装饰器 @app.before_request 和 @app.after_request以及@app.errorhandler() 一.背景: Flask我们已经学习很多基础知识了,现在有一个问题 我们现在有一个 Flask 程序其中有3个路由和视图函数,如下: from flask import Flask app = Flask(__name__) # type:Flask @app.route("/login") def login(): return "Login

flask中app.py: error: invalid choice: 'insert'........的问题

在flask中,分为两种操作方式,url指向函数或者终端指向函数,最终目的就是让函数执行,触发方式不同.终端执行更加安全, flask中app.py: error: invalid choice: 'insert'........的问题 原文地址:https://www.cnblogs.com/chaojiyingxiong/p/9535311.html

pythonWeb框架flask中使用blinker信号机制解耦业务代码解决ImportError: cannot import name 'app',以异步发送邮件为例

百度了大半天,不知道怎么搞,直到学习了blinker才想到解决办法,因为之前写java都是文件分开的, 所以发送邮件业务代码也放到view里面,但是异步线程需要使用app,蛋疼的是其他模块不能从app.py导入任何变量: 即: app.py是主文件,view.py是业务文件, 我需要在view中使用app中的变量,怎么办,百度了很多,没有找到方法 这里可以用信号实现,先记录一下: python3内置了blinker,可以直接使用,首先在view里定义信号: 然后在app.py里面连接需要使用的函

flask 中xx.init_app(app)方法

bootstrap = Bootstrap() mail = Mail() moment = Moment() db = SQLAlchemy() def create_app(config_name): app = Flask(__name__) #将指定的配置通过from_object()方法导入app.config字典配置对象 app.config.from_object(config[config_name]) config[config_name].init_app(app) boot

Flask初识,第十篇,Flask中的装饰器 before_request after_request

Flask我们已经学习很多基础知识了,现在有一个问题 我们现在有一个 Flask 程序其中有3个路由和视图函数,如下:  简单的小程序 如果登陆了,就可以访问 index 和 home 页面,如果没登录就跳转到 login 登录 要怎么解决呢, session 对, 用 session 除了 Login 函数之外的所有函数里面全校验 session 是否登录了 太麻烦了,现在咱们只有3个函数,如果成百上千个怎么整啊 装饰器,对没错,装饰器是一个很好的方案,但是啊,我现在还是成败上千个函数,我要在

[转载]在 Windows 10 中, 如何卸载和重新安装 OneNote App

在 Windows 10 中, 如何卸载和重新安装 OneNote App 15/8/2015 使用 PowerShell 命令卸载 OneNote App 开始菜单 -> 输入 "Powershell" -> 右键点击菜单 -> 用管理员运行 -> 输入以下命令行 Get-AppxPackage *microsoft.office.onenote* | Remove-AppxPackage 使用 Windows 商店重新安装 OneNote App 打开 Wi

Android 4.1 APP中的static变量即使在APP退出后仍然不会被擦除

Android 4.1 APP中的static变量即使在APP退出后仍然会保留最后赋值状态. public class MainActivity extends Activity { private TextView tv; private static int i=10; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVie

在GOOGLE浏览器中模拟移动浏览器 调试Web app

在此记录下,以便在今后的工作中用到. 首先通过F12 or Ctrl+Shift+i,打开开发者工具,点击开发者工具面板的 (show  drawer)按钮,出现如下图所示的面板: 切换至Emulation选项卡中,在这里我们就可以自由地模拟各种各样的移动浏览器了,该功能支持了包括iPhone.ipad.google nexus系列等机型.   感兴趣的同学赶紧去试试吧.你会发现chrome是最好的web app开发利器.   温馨提示:需要在chorme 32版本后,才有些设置哦.   最后还