我可以通过 Django 视图访问装饰器中的上下文对象吗

Can I access context object in decorator over django view

我有多个 Django 视图,我想根据它们的响应和状态代码向它们添加一些上下文。现在我有一个看起来像这样的代码:

def my_decor(func):
    def wrapper(*args, **kwargs):
        response = func(*args, **kwargs)
        if response.status_code == 200:  # It will be changed to manipulate 2XX reponses only
            new_data = foo()
            response.context['some_new_data'] = new_data
        return response
    return wrapper


@my_decor
def view1(request):
    # some logic
    context = {'some_data': 'some_value'}
    return render(request, 'some_template.html', context)


@my_decor
def view2(request):
    # more logic
    return render(request, 'another_template.html')

所以,基本上,我想创建装饰器,它可以与在 return 上附加上下文的视图和不附加上下文的视图一起使用。 现在我得到 AttributeError: 'HttpResponse' object has no attribute 'context'。 我做错了什么?

Python 2.7.13 和 Django 1.7.11

在你的装饰器中调用func(*args, **kwargs)之后,你已经渲染了模板,现在改变模板已经来不及了。

您可以切换到 TemplateResponse,这样您就可以在呈现模板之前修改上下文。使用响应的 context_data 属性访问上下文。

from django.template.response import TemplateResponse

@my_decor
def view1(request):
    # some logic
    context = {'some_data': 'some_value'}
    return TemplateResponse(request, 'some_template.html', context)

在您的装饰器中,将 response.context 更改为 response.context_data:

    if response.status_code == 200:  # n.b. this is only for 200 responses, not 2XX as you say in your comment
        new_data = foo()
        response.context_data['some_new_data'] = new_data