用于从视图确定HTTP响应的装饰器

1 投票
2 回答
1638 浏览
提问于 2025-04-15 21:10

我想创建一个装饰器,这样当GET请求中的参数“raw”等于“1”时,就能返回一个原始的或“字符串”形式的视图。这个想法是可行的,但我卡在了如何将上下文传递给我的渲染器。以下是我目前的进展:

from django.shortcuts import render_to_response
from django.http import HttpResponse
from django.template.loader import render_to_string

def raw_response(template):
    def wrap(view):
        def response(request,*args,**kwargs):
            if request.method == "GET":
                try:
                    if request.GET['raw'] == "1":
                        render = HttpResponse(render_to_string(template,{}),content_type="text/plain")
                        return render
                except Exception:
                    render = render_to_response(template,{})
                    return render
        return response
    return wrap

现在,{}只是一个占位符。最终,我希望能够传递一个像这样的字典:

@raw_response('my_template_name.html')
def view_name(request):
  render({"x":42})

任何帮助都非常感谢。

2 个回答

0

你只需要在你的装饰器里面调用一下 view,然后使用它返回的上下文。

if request.method == "GET":
    context = view(*args, **kwargs)
    try:
        if request.GET['raw'] == "1":
            render = HttpResponse(
                         render_to_string(template, context),
                         content_type="text/plain"
                     )
            return render

然后就这样。不过我不太确定如果 raw 不是 1 的话会发生什么。

0

让你的真实视图方法返回一些有意义的东西(在这个例子中是一个上下文的 dict),然后调用它。

def raw_response(template):
    def wrap(view):
        def response(request, *args, **kwargs):
            context = view(request, *args, **kwargs)
            if request.method == 'GET' and request.GET.get('raw', '0') == '1':
                return HttpResponse(render_to_string(template, context),
                                    content_type='text/plain')
            # POST or not raw
            return render_to_response(template, context)
        return response
    return wrap

@raw_response('my_template_name.html')
def view_name(request):
    return {'x': 42}

撰写回答