关于 Django 对 HTTP 协议的尊重
因为我们是完美主义者,所以在设计 Django 时,我们非常小心地确保它在遵循 HTTP 标准方面“做正确的事情”。
Ryan Tomayko 在今年早些时候的 "关于 HTTP 滥用"文章 中谈到了 HTTP 以及大多数 Web 框架如何没有正确使用它。在文章中,他反问哪些框架使某些 HTTP 功能易于使用,或者以“正确”的方式使用它。
让我们详细看一下他的每个问题,并准确指出 Django 在每种情况下都做了什么。
例如,哪些框架……帮助正确实现 内容协商?
Django 的一些部分会自动为您执行服务器驱动的内容协商。例如,GZipMiddleware 会为理解 gzip 压缩的浏览器压缩内容。
Django 为开发人员提供了一种简单的方法来设置Vary头,如上面链接的 RFC 中所述,“表达服务器用于选择受服务器驱动协商影响的表示的参数”。请参阅 "使用 Vary 头"文档。默认情况下,Django 附带的所有功能,例如会话和缓存系统,都会自动设置相应的Vary头。
对于更晦涩的内容协商需求,您可以在任何 请求对象 中访问所有 HTTP 头。如果您能想到任何我们可以添加到 Django 中的有用的与协商相关的功能,请通过发布到 django-developers 或我们的 工单系统 告知我们。
……提供用于实现动态内容智能缓存策略的工具?(正确使用If-Modified-Since, Expires, Cache-Control等)
Django 的中间件负责处理此问题。 ConditionalGetMiddleware 处理If-None-Match或If-Modified-Since. CacheMiddleware 处理Last-Modified, Expires和Cache-Control头。
……使处理媒体类型变得容易?
目前,处理媒体文件不在 Django 的范围内。
……使处理字符编码变得容易?
Django 在这里为您提供了保障。 DEFAULT_CHARSET 设置 允许您指定所有 Django 驱动的页面中输入和输出的系统范围字符编码。一切正常。
……鼓励使用标准的 HTTP 身份验证方案?
Django 的会话支持不使用标准的 HTTP 身份验证,因为我们不喜欢 HTTP 身份验证在现代浏览器中的可用性(或缺乏可用性)——特别是用户无法在不关闭浏览器的情况下注销这一事实。如果有兴趣,我们可以添加对 HTTP 身份验证的支持。
……有一个合理的机制将不同的行为附加到单个资源的不同动词?
是的。我们对此非常狂热。这就是为什么每个请求对象都有单独的GET和POST属性——因此开发人员可以区分两者。您可以使用request.META["REQUEST_METHOD"]获取确切的请求方法,以防您需要支持不太常见的方法,例如PUT.
……帮助确保 URI 保持简洁?
一个有力的肯定。这是我们另一个狂热的追求。Django 的 URL 分派语法 鼓励使用简洁的 URL——没有文件扩展名的 URL。它还可以轻松支持旧版(例如“.php”)URL 并根据需要重定向它们。
……使处理传输编码(gzip、compress 等)变得容易?
只需打开 GZipMiddleware,Django 就会自动为支持它的浏览器压缩您的页面。我们没有“compress”中间件,但添加一个非常容易。
……帮助您正确使用响应状态码?(例如,几乎所有动态内容都返回 200 或 500)。
这是我们另一项充满热情的追求。每个 响应对象 默认使用状态码 200。 HttpResponse 子类(例如HttpResponseServerError或HttpResponseNotFound)都返回正确的状态码。我们鼓励您在应用程序中使用正确的响应类型。
内置的 Django 页面,例如错误页面和“页面未找到”错误页面,分别使用 500 和 404。
返回顶部