【问题标题】:Decorator for determining HTTP response from a view用于确定来自视图的 HTTP 响应的装饰器
【发布时间】:2010-04-02 15:45:42
【问题描述】:

我想创建一个装饰器,如果 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})

感谢任何帮助。

【问题讨论】:

    标签: python django decorator


    【解决方案1】:

    让你的真实视图方法返回一些合理的东西(在这种情况下是一个上下文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}
    

    【讨论】:

      【解决方案2】:

      您只需要在装饰器中调用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 会发生什么。

      【讨论】:

      • 谢谢!同样, context = view(*args, **kwargs) 是我所缺少的。
      猜你喜欢
      • 2014-06-07
      • 1970-01-01
      • 1970-01-01
      • 2011-10-30
      • 2015-02-01
      • 2023-02-07
      • 2012-12-24
      • 2014-10-20
      • 2016-08-16
      相关资源
      最近更新 更多