Django - 为什么我需要使用render_to_response呢?
Django - 为什么我需要使用render_to_response呢?
考虑以下内容:\n
return render(request, 'index.html', {..context..}) return render_to_response('index.html', {..context..})
\n一方面,render
更加简洁和符合Python风格。另一方面,你使用request
作为第一个参数,我觉得这是多余和令人困惑的。所以我开始想到更大的区别是什么...\n根据文档:\n
\nrender()等同于调用render_to_response()并使用context_instance参数强制使用RequestContext。\n
\n所以区别只在于使用RequestContext。那么RequestContext的重要性是什么呢?让我们再次看看文档:\n
\n一个特殊的Context类[...]与普通的django.template.Context有些不同。第一个区别是它以HttpRequest作为第一个参数。\n
\n好的。那几乎没有什么关系。\n
\n第二个区别是它根据您的TEMPLATE_CONTEXT_PROCESSORS设置自动填充上下文中的一些变量[...]除此之外,RequestContext始终使用django.core.context_processors.csrf[...]它被故意硬编码,无法通过TEMPLATE_CONTEXT_PROCESSORS设置关闭。\n
\n所以这是重要的部分-确保所有上下文处理器正常工作,特别是csrf。所以实际上,回到我第一个例子,这两个实际上是相同的:\n
return render(request, 'index.html', {...}) return render_to_response('index.html', {...}, context_instance=RequestContext(request))
\n现在,第二个例子显然更糟糕,整个过程似乎过于复杂。所以我的一个重要问题是为什么还要使用render_to_response
?为什么不废弃它?\n我还想到了其他问题:\n
- \n
- 难道没有更好的方法来强制使用
RequestContext
作为默认值吗? - 有没有办法避免将
request
作为参数传递?这实在是多余的。我找到了一个博客文章,展示了如何将render_to_response转换为易于使用的装饰器。我们不能用类似的方法来处理render
吗? - 对于这个问题(如果它确实是个问题),有没有任何考虑?我在未来废弃计划中没有看到任何相关内容。我觉得这很令人困惑,因为
render
是在django 1.3中提出来的,专门解决了render_to_response的问题,而且大家都同意 不应该使用render_to_response
\n
\n
\n
\n我知道这似乎有点离题,但我希望能得到解释为什么render_to_response
仍然存在和/或使用render_to_response
优于render
的使用案例的答案(如果有的话)。
为什么我要使用render_to_response?这个问题的出现的原因是想要找到更好的方法来强制使用RequestContext作为默认。解决方法是可以写一个装饰器来实现,但这个问题是主观的,很难说使用起来是否容易。是否能避免传递request作为参数呢?可以通过使用render方法,该方法将强制使用RequestContext作为参数。最后一个问题并不需要回答,如果你了解Django背后的代码是如何工作的。在这个问题中,没有给出一个明确的答案,只是重复了解释并展示了源代码,这些我已经自己阅读和审查过了。这里没有给出我关于为什么render_to_response仍然存在的问题的答案。我理解RequestContext在初始化时需要实际的请求作为参数,但我仍然不完全相信没有办法避免将其作为参数使用。
为什么我应该使用render_to_response呢?
大多数应用程序都使用render_to_response,因为它从一开始就是默认推荐的选项,直到Django 1.3版本。两者共存的原因是历史性的,废弃render_to_response将强制重写大量代码,在小版本的发布中是不礼貌的。然而,在这个django-developer线程中,他们说可以在2.0版本的废弃时间表中包含它。
以下是Django核心开发人员之一Russell Keith-Magee的一句引用。Keith-Magee回答了Jacob Kaplan-Moss提出的一个问题,Jacob Kaplan-Moss是另一位Django贡献者,他提出了废弃render_to_response的问题:
我认为我们应该废弃render_to_response(),而使用render()。
render_to_response()只是render(request=None, ...),对吗?
保留两者之间没有特殊的原因,除了废弃会带来的代码变动。
而Keith-Magee回答:
这是我在2.0版本计划中没有问题废弃的事情,但在未来的18个月/2个发布版本内迁移每个render_to_response()的使用似乎是一种对整个用户群体强制执行的极端措施,而维护render_to_response()并不需要任何实际努力。
没有人讨论过这个废弃问题,但我想你的问题的答案是:没有技术原因,只是他们不想在一个小版本中强迫更新整个代码库。
这是一个比其他答案更好的回答。如果允许,我打算进一步研究这个主题,并在将其标记为正确之前编辑您的答案以包含引用和其他内容。这个链接中有django核心开发人员的答案。谢谢您提供的信息。