Python中Flask的上下文机制在Django中有类似的处理方式吗?

flask 的特色:上下文( application context 和 request context ),django 有类似的实现方式吗? 还是 django 根本用不到这个所谓的上下文方式?
Python中Flask的上下文机制在Django中有类似的处理方式吗?

11 回复

都不懂… 不过或许你说的是中间件?


Django里确实有类似Flask上下文机制的东西,不过实现方式不太一样。

Flask用requestsessiong这些线程局部变量(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_requestafter_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,会存在大量的样板代码。

回到顶部