7

我似乎很难在我的一个中间件类中设置一个变量,然后我可以在模板层中访问该变量。

基本布局是这样的:

class TheMiddleware(object):
    def __init__(self, etc):
        stuff...

    def process_response(self, request, response):
        request.my_var = "whatever"
        return response

然后在模板上获得不同的视图:

{% custom_tag arg_a %}

这是一个模板标签,应该从请求中返回变量:

@register.simple_tag
def custom_tag(arg_a):
    return threading.currentThread().request.my_var

此错误与“渲染时捕获 AttributeError:'WSGIRequest' 对象没有属性 'my_var'”

我认为这可能是我在模板标签中访问请求的方式。所以我将 django.core.context_processors.request 添加到我的 TEMPLATE_CONTEXT_PROCESSORS 中,并尝试将请求对象传递给标签,然后直接从模板访问请求,但没有运气。

我想我对请求对象的工作方式缺乏了解。是否可以将变量分配给请求对象并在多个视图中选择该变量?我认为请求对象是通过视图传递的,但似乎生成了一个新实例。

如果是这种情况,您将如何在中间件中存储一个全局变量,然后您可以从应用程序中的任何位置访问它,无论是在视图中还是在模板中?

更新

为了消除混淆(无论是我的还是其他人,我都不确定!)我没有尝试在视图的 process_response 中间件中设置请求变量,然后在同一视图的模板中选择它。我知道那是行不通的,因为在保存变量之前已经处理了模板。(这是我的故意行为)。

我有两个视图,view1view2视图一个有一个装饰器,它导致中间件在请求中设置变量。我希望访问该变量的是 view2 模板,它是在设置变量之后出现的。

4

2 回答 2

10

您试图在处理中间件的响应期间设置变量。

我认为您应该实施process_request()来设置变量。

def process_request(self, request):
    request.my_var = "whatever"
    return 
于 2013-03-26T10:03:14.950 回答
3

如果您在请求中设置它,我看不出有任何理由在这里尝试使用 threadlocals。您应该按照您的描述使用上下文处理器。

但是,您的问题的原因process_response是在请求/响应周期的响应阶段运行:即您的视图被调用之后。您应该process_request改为定义。有关调用中间件方法的顺序的说明,请参见此处。

于 2013-03-26T10:03:05.257 回答