Django - 为什么我应该使用 render_to_response ?

2023-12-23

考虑一下:

return render(request, 'index.html', {..context..})
return render_to_response('index.html', {..context..})

一方面,render更干净,更Pythonic。另一方面,您使用request作为你的第一个论点,我发现它是多余且令人困惑的。所以我开始想知道更大的差异......

根据the docs https://docs.djangoproject.com/en/dev/topics/http/shortcuts/#django.shortcuts.render:

render() 与调用 render_to_response() 相同 context_instance 参数强制使用 RequestContext。

所以区别仅在于使用RequestContext。那么RequestContext 重要的是什么?让我们看看再次文档 https://docs.djangoproject.com/en/dev/ref/templates/api/#django.template.RequestContext:

一个特殊的 Context 类 [...] 的行为与 正常的 django.template.Context。第一个区别是它需要 HttpRequest 作为其第一个参数。

好的。这根本不重要

第二个区别是它自动填充上下文 根据您的 TEMPLATE_CONTEXT_PROCESSORS 有一些变量 设置 [...] 除了这些之外,RequestContext 总是使用 django.core.context_processors.csrf [...]它是故意硬编码的 且不能被 TEMPLATE_CONTEXT_PROCESSORS 关闭 环境。

所以这是重要的部分 - 确保所有上下文处理器正常工作,重点是 csrf。真的,回到我的第一个例子,these实际上是一样的:

return render(request, 'index.html', {...})
return render_to_response('index.html', {...}, context_instance=RequestContext(request))

现在,第二个例子显然要糟糕得多,整个事情似乎过于复杂。所以我的大问题是Why use render_to_response根本吗?为什么不弃用它呢?

我想到的其他问题:

  1. 难道就没有更好的办法来强制执行吗RequestContext作为默认值?
  2. 有没有办法避免通过request作为一个论点?这是非常多余的。我发现一篇博文 http://lincolnloop.com/blog/2008/may/10/getting-requestcontext-your-templates/展示如何将 render_to_response 变成一个易于使用的装饰器。我们不能做类似的事情吗render?
  3. 对于这个问题有什么想法吗(如果这是一个问题的话)?我在其中什么也没看到未来弃用时间表 https://docs.djangoproject.com/en/dev/internals/deprecation/。我觉得这特别令人困惑,考虑到render与 django 1.3 一起出现具体来说解决 render_to_response 的问题 https://stackoverflow.com/a/5693814/2387772, 然后每个人都同意 https://stackoverflow.com/questions/5154358/django-what-is-the-difference-between-render-render-to-response-and-direc 你不应该使用 http://rayed.com/wordpress/?p=1445 render_to_response

我知道这似乎有点偏离主题,但我希望得到能解释原因的答案render_to_response留在周围和\或使用用例的示例render_to_response将优先于render(如果有的话)


大多数应用程序都使用render_to_response因为它从一开始就是默认推荐选项,直到 Django 1.3。两者共存的原因是历史性的、不赞成的render_to_response将迫使大量代码被重写,这在次要版本中是不礼貌的。然而在这个 django 开发者线程中 https://groups.google.com/forum/#!searchin/django-developers/render_to_response%2420render/django-developers/mOx9ddVTrPA/np4ZYoAQOXcJ他们表示可以将其纳入 2.0 的弃用时间表中。

这是引用者拉塞尔·基思·马吉 https://people.djangoproject.com/freakboy3742/,Django 核心开发人员之一。 Keith-Magee 回答了另一位 Django 贡献者 Jacob Kaplan-Moss 提出的弃用问题render_to_response:

我认为我们应该弃用 render_to_response(),转而使用 render()。 render_to_response() 只是 render(request=None, ...),对吧?任何 有理由保留两者吗?除了弃用会带来的代码混乱之外,没有什么特别的理由保留两者。

基思-马吉回答说:

这是我在 2.0 中毫不犹豫地弃用的东西 计划,但将 render_to_response() 的每次使用迁移到 接下来的 18 个月/2 版本似乎是强制执行的极端措施 维护 render_to_response() 时的整个用户群不会 付出任何真正的努力。

没有人讨论过这种弃用,但我想您问题的答案是:没有技术原因,只是他们的意图是不强制在次要版本(至少没有主要版本)中更新所有代码库。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django - 为什么我应该使用 render_to_response ? 的相关文章

随机推荐