当前位置: 首页 > 面试题库 >

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

包修贤
2023-03-14
问题内容

考虑一下:

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

一方面,render它更干净,更pythonic。另一方面,你将request用作第一个参数,但我觉得这很多余和令人困惑。所以我开始怀疑更大的差异…

根据文档:

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

因此,区别仅在于使用RequestContext。那么,RequestContext的重要之处是什么?让我们再次看一下文档:

特殊的Context类的行为与普通的django.template.Context略有不同。第一个区别是它将HttpRequest作为其第一个参数。

好。根本没关系

第二个区别是,根据你的TEMPLATE_CONTEXT_PROCESSORS设置,它会自动使用一些变量填充上下文[...]除了这些,RequestContext始终使用django.core.context_processors.csrf [...]并且无法通过TEMPLATE_CONTEXT_PROCESSORS设置关闭。

因此,这是重要的部分-确保所有上下文处理器都能正常工作,并重点放在csrf上。所以真的,回到我的第一个示例,这些实际上是相同的:

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

现在,第二个例子显然更糟,整个事情似乎太过复杂了。所以我最大的问题是为什么要使用render_to_response?为什么不反对呢?

想到的其他问题:

  1. 有没有更好的方法来强制执行RequestContext默认设置?
  2. 有没有办法避免传递request为参数?这是非常多余的。我找到了一篇博客文章,展示了如何使render_to_response成为易于使用的装饰器。我们不能做类似的事情render吗?
  3. 有没有考虑这个问题(如果有问题的话)?在将来的弃用时间表中,我什么也看不到。考虑render到django 1.3 专门解决了render_to_response的问题,并且所有人都同意 你不应使用 django 1.3 ,我觉得这特别令人困惑。 render_to_response
    我知道这似乎有点题外话,但我希望能得到答案,以解释为什么render_to_response会留下来和/或用例的示例,其中使用render_to_response将优先于render(如果有)

问题答案:

大多数应用程序都使用render_to_response它,因为自从Django 1.3开始就一直是推荐的默认选项。两者并存的原因是历史性的,弃用render_to_response将迫使大量代码被重写,而在次要版本中这并不礼貌。但是,在这个django-developer线程中,他们说有可能将2.0的弃用时间表包括在内。

这是Django的核心开发人员之一Russell Keith-Magee的报价。Keith-Magee回答了另一位Django贡献者Jacob Kaplan-Moss提出的问题,提出了弃用问题render_to_response

我认为我们应该弃用render_to_response(),转而使用render()。render_to_response()只是render(request = None,…),对吗?有什么理由让两者同时存在吗?除了弃用可能引起的代码混乱外,没有什么特别的理由可以保留两者。

而Keith-Magee回答:

在2.0计划上,我对此没有任何疑问,但是在维护render_to_response()时,在接下来的18个月/ 2个版本中迁移render_to_response()的每次使用似乎是对整个用户基础实施的一种极端措施。付出任何真正的努力。

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



 类似资料:
  • 问题内容: 之间有什么区别: 和 我知道JPanel是GUI组件的容器,但我确实看不到使用它的实用程序。当然,我错了,但我是从Swing开始的,所以…为什么我应该使用JPanel?真正的目的是什么? 问题答案: 为什么我应该使用JPanel? 您可以使用JPanel获得以下一项或多项好处: 将组件分组在一起。 为了更好地组织您的组件。 为了使我们能够使用 多种布局 并组合其效果。(例如,用于数字键

  • 问题内容: 为什么以及何时应该在php中使用该函数?使用后是否应该始终使用它?我读到我必须使用它来防止会话固定,这是唯一原因吗? 问题答案: 什么啊 就像函数名称所说的那样,它是一个函数,它将用新的ID替换当前的会话ID,并保留当前的会话信息。 它有什么作用? 它主要有助于防止会话固定攻击。会话固定攻击是恶意用户试图利用系统中的漏洞固定(设置)另一个用户的会话ID(SID)的地方。这样,他们将拥有

  • 为什幺应该使用流 在node中,I/O都是异步的,所以在和硬盘以及网络的交互过程中会涉及到传递回调函数的过程。你之前可能会写出这样的代码: var http = require('http'); var fs = require('fs'); var server = http.createServer(function (req, res) { fs.readFile(__dirname

  • 问题内容: 看看这个: 我运行了一个快速的Google搜索,但找不到答案- 我应该用什么代替? 问题答案: 由于django 1.7 引入的迁移系统而被弃用。 现在,您可以使用 跟踪 更改。这会将您的模型更改转换为python代码,以使其可部署到另一个数据库。当您需要对数据库进行进一步的修改时,可以使用数据迁移。 创建迁移后,您必须 应用 它们:。 因此,除了使用之外,您还应该使用然后。 更改模型

  • 问题内容: 看看这个: 问题答案: 由于django 1.7引入的迁移系统而被弃用。 现在,你可以使用跟踪更改。这会将你的模型更改转换为python代码,以使其可部署到另一个数据库。当你需要对数据库进行进一步的修改时,可以使用数据迁移。 创建迁移后,你必须应用它们:。 因此,除了使用之外,你还应该使用然后。 更改模型中的某些内容后,开发工作流程如下: 在你的生产系统上: 奖励:你无需migrate

  • 我的老师让我这样做,但在评论区我被告知我不应该这样做。 为什么?