Python中Flask的上下文机制在Django中有类似的处理方式吗?
flask 的特色:上下文( application context 和 request context ),django 有类似的实现方式吗? 还是 django 根本用不到这个所谓的上下文方式?
Python中Flask的上下文机制在Django中有类似的处理方式吗?
都不懂… 不过或许你说的是中间件?
Django里确实有类似Flask上下文机制的东西,不过实现方式不太一样。
Flask用request、session、g这些线程局部变量(thread-local)来管理请求上下文和应用上下文。Django则是通过传递request对象作为参数来实现类似功能。
在Django视图中,每个请求都会有一个request对象传入:
def my_view(request):
user = request.user # 类似Flask的g
session_data = request.session # 类似Flask的session
# request对象贯穿整个请求生命周期
对于模板渲染,Django通过context字典传递数据:
def my_view(request):
context = {
'user': request.user,
'data': some_data
}
return render(request, 'template.html', context)
Django中间件也能实现类似Flask的before_request和after_request:
class MyMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# 类似Flask的before_request
request.custom_data = "some value"
response = self.get_response(request)
# 类似Flask的after_request
return response
简单说,Django用显式参数传递,Flask用隐式上下文。
没用过 flask,context 实现了什么功能?
我司以前用过 django 的 global request。
with…as… 自动也可以实现上下文
应该是指 flask 里 request 对象的实现吧 不像 django 需要在视图函数里指定一个 request 的参数, 直接就能在函数体里使用 request 对象
应用上下文和请求上下文
g 在 flask 里单独有
request 是请求上下文。flask 还有一个应用上下文,一般配合消息队列,或 redis 使用的
玩了好几个框架,应该是没有的。
Flask 这个上下文是通过 ThreadLocal 实现的
Django 应该目前应该是没有流行得类似机制的
其实这也没啥,就是 ThreadId ( routineId )— argument 的绑定
自己想的话用 Storage Platform 也可以实现出来
所以 request 也不用导入吗?我是 from flask import request 之后才能用啊,我还以为是一个类似 proxy 一样的东西。试过直接在视图函数里面用 request 会报错,是用法不对?
request 就是每个 view 的那个参数,current_app 应该没有,但我用 flask 也完全没用过这东西。
什么情况下使用消息队列和 redis 需要 current_app ?
request,g 那个是 Flask 的特别之处
高效简洁优雅
用了一个栈的数据结构,巧妙的简化了问题。
Django 是每个 view 处理参数,接收一个 request,会存在大量的样板代码。

