Flask中的应用和请求上下文

本文探讨了Flask框架如何通过上下文避免繁琐的视图函数参数传递,介绍request对象在请求处理中的作用,并区分了应用上下文和请求上下文。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题场景

        Flask从客户端接受到请求时,视图函数需要能够接受一些特殊对象,这样才能够处理请求。请求对象 request 就是一个很好的例子,它封装了客户端发送的HTTP请求。

        要想让视图函数能够访问请求对象,一种直截了当的方式是将其作为参数传入视图函数,不过这会导致应用中的每个视图函数都多出一个参数。除了访问请求对象,如果视图函数在请求处理时还需要访问其它对象,情况会变得更加糟糕。根据面向对象的思想,显然这样的框架设计是不合理的。

二、解决方案

        为了避免大量必须的参数的添加,使得接口繁琐、混乱,Flask使用上下文来统一管理这些特殊的对象,使得这些对象变得全局可以访问。有了上下文之后,就可以像下面这样编写视图函数:

from flask import request

@app.route('/')
def index():
    user_agent = request.headers.get('User-Agent')
    ...

        在这个视图函数中我们把 request当做全局变量使用。但是实际上,request不可能是全局变量。想象一下,在多线程服务器中,多个线程同时处理不同客户发送的请求时,每个线程获取到的request对象必然不同。Flask使用上下文让特定的变量在一个线程中全局可访问,但不会干扰其它线程。

        更确切的说,request属于请求上下文。Flask有两种上下文,应用上下文请求上下文。具体如下:

Flask上下文全局变量
变量名上下文说明
current_app应用上下文当前应用的应用实例
g应用上下文处理请求时用作临时存储的对象,每次请求都会重设这个变量
request请求上下文请求对象,封装了客户端发出的HTTP请求中的内容
session请求上下文用户回话,值为一个字典,存储请求与服务器之间需要“记住”的值

        Flask在分派请求之前推送上下文,请求完之后再将其删除。

参考文献:《Flask Web开发(第二版)》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值