Django 1.5发行说明

2013年2月26日

欢迎来到Django 1.5!

这些发行说明涵盖了 new features 以及一些 backwards incompatible changes 从django 1.4或更旧版本升级时,您需要注意。我们还删除了一些功能,这些功能在 our deprecation plan 我们已经 begun the deprecation process for some features .

概述

Django1.5中最大的新功能是 configurable User model . 在django 1.5之前,希望使用django的auth框架的应用程序 (django.contrib.auth )被迫使用Django对“用户”的定义。在Django 1.5中,您现在可以换掉 User 你自己写的模型。这可能是对现有 User 模型——例如,您可以添加Twitter或Facebook ID字段——或者完全替换 User 一个完全为你的网站定制的。

Django 1.5也是 Python 3 support !我们将这种支持标记为“实验性的”,因为我们还没有考虑到它的生产准备就绪,但是一切都已就绪,您可以开始将应用程序移植到python 3。我们的下一个版本django 1.6将免费支持python 3。

Django 1.5的其他显著新功能包括:

在可能的情况下,我们尝试以向后兼容的方式根据 our API stability policy . 但是,与以前的版本一样,Django1.5附带了一些小版本 backwards incompatible changes ;从Django的早期版本升级的用户应该仔细阅读该列表。

值得注意的一个不推荐的特性是转向“新样式” url 标签。在django 1.3之前,语法类似 {{% url myview %}} 被错误地解释(Django认为 "myview" 是视图的文本名称,而不是名为 myview )Django 1.3及以上介绍了 {{% load url from future %}} 语法引入正确的行为 myview 被视为变量。

结果就是如果你不使用 {{% load url from future %}} 在模板中,您需要像 {{% url myview %}}{{% url "myview" %}} . 如果你 were 使用 {{% load url from future %}} 你只需在Django 1.5下删除该行即可。

python兼容性

Django1.5需要python 2.6.5或更高版本,尽管我们 强烈推荐 python 2.7.3或更高版本。已放弃对python 2.5及以下版本的支持。

这种更改只会影响少数Django用户,因为目前大多数操作系统供应商都将python 2.6或更新版本作为其默认版本。但是,如果您仍在使用python 2.5,则需要坚持使用django 1.4,直到您可以升级python版本。每 our support policy ,django 1.4将继续获得安全支持,直到django 1.6发布。

Django1.5不在Jython最终版本上运行,因为Jython的最新版本目前不支持Python2.6。然而,Jython目前提供的alpha版本具有2.7支持,Django1.5支持alpha版本。

python 3支持

Django1.5引入了对python 3的支持,特别是对python 3.2及更高版本的支持。它的形式是 单一的 代码库;您不需要在python 3上安装不同版本的django。这意味着您可以编写仅针对Python2、仅针对Python3或支持这两个平台的单个应用程序的应用程序。

然而,我们现在将这种支持标记为“实验性的”:虽然它通过我们的自动化测试套件得到了广泛的测试,但它得到的实际测试很少。我们已经尽了最大努力消除了bug,但我们不能确定是否涵盖了Django的所有可能用途。

Django的某些功能不可用,因为它们依赖于尚未移植到python 3的第三方软件,包括:

此外,Django不仅仅是一个Web框架;它是一个可插入组件的生态系统。此时,很少有第三方应用程序被移植到python 3,因此现实世界中的应用程序不太可能在python 3下满足所有的依赖关系。

因此,我们建议Django1.5不要在Python3下的生产中使用。相反,利用这个机会开始将应用程序移植到Python3。如果您是可插拔组件的作者,我们建议您现在就开始移植。

我们计划在下一个版本django 1.6中为python 3提供一流的、生产就绪的支持。

Django 1.5的新功能

可配置用户模型

在Django1.5中,您现在可以使用自己的模型作为与用户相关的数据的存储。如果您的项目需要一个超过30个字符的用户名,或者您希望以名字/姓氏以外的格式存储用户名,或者您希望将自定义配置文件信息放到您的用户对象上,现在可以这样做。

如果有第三方可重用应用程序引用用户模型,则可能需要对引用用户实例的方式进行一些更改。您还应该记录应用程序所依赖的用户模型的任何特定特性。

documentation on custom user models 了解更多详细信息。

支持保存模型字段的子集

方法 Model.save() 有一个新的关键字参数 update_fields . 通过使用此参数,可以只保存模型字段的选择列表。这对于性能原因或试图避免覆盖并发更改时很有用。

延迟实例(由 .only().defer() )将只自动保存加载的字段。如果在加载后手动设置了任何字段,则该字段也将在保存时得到更新。

Model.save() 有关详细信息的文档。

明确支持流响应

在django 1.5之前,可以通过将迭代器传递给 HttpResponse . 但这是不可靠的:任何访问 content 属性将过早地使用迭代器。

现在,您可以使用新的 StreamingHttpResponse 类。此类公开 streaming_content 属性,它是迭代器。

自从 StreamingHttpResponse 没有一个 content 属性,需要访问响应内容的中间件必须测试流式响应并相应地运行。

{{% verbatim %}} 模板标签

为了更容易处理与Django语法冲突的javascript模板,现在可以使用 verbatim 阻止标记以避免分析标记的内容。

检索 ContentType 与代理模型关联的实例

方法 ContentTypeManager.get_for_model()ContentTypeManager.get_for_models() 分别有一个新的关键字参数 for_concrete_modelfor_concrete_models . 旁路 False 使用此参数现在可以检索 ContentType 与代理模型关联。

新的 view 基于类的视图上下文中的变量

总共 generic class-based views (或继承自的任何基于类的视图) ContextMixin )上下文字典包含 view 指向的变量 View 实例。

GeoDjango

新教程

添加到文档中的内容包括 Tutorial 3 和一个新的 tutorial on testing . 新的部分“高级教程”提供 How to write reusable apps 以及在 Writing your first patch for Django .

次要特征

Django 1.5还包括一些较小的改进,值得注意:

  • 模板引擎现在解释 TrueFalseNone 作为相应的python对象。

  • django.utils.timezone 提供用于在时区之间转换感知日期时间的帮助程序。见 localtime() .

  • 通用视图支持选项请求。

  • 管理命令不提升 SystemExit 当代码从调用时 call_command() . 命令引发的任何异常(主要是 CommandError )传播。

    此外,当您在自定义命令中输出错误或消息时,现在应该使用 self.stdout.write('message')self.stderr.write('error') (见注释 management commands output

  • 这个 dumpdata 管理命令一次输出一行,防止在转储大型数据集时出现内存不足错误。

  • 在加拿大的当地风味中, pq 被添加到魁北克可接受的代码中。这是一个古老的缩写。

  • 这个 receiver decorator现在可以通过提供信号列表来连接到多个信号。

  • 在管理员中,现在可以按用户所属的组筛选用户。

  • QuerySet.bulk_create() 现在有一个批量大小参数。默认情况下,批处理大小不受限制,但sqlite除外,其中单个批处理受到限制,因此每个查询不超过999个参数。

  • 这个 LOGIN_URLLOGIN_REDIRECT_URL 设置现在也接受视图函数名和 named URL patterns . 这允许您减少配置重复。更多信息可在 login_required() 文档。

  • Django现在提供了一个mod wsgi auth handler .

  • 这个 QuerySet.delete()Model.delete() 在某些情况下,现在可以走捷径。快速路径允许更少的查询和更少的对象被提取到内存中。见 QuerySet.delete() 有关详细信息。

  • 的实例 ResolverMatch 在请求中存储为 resolver_match .

  • 默认情况下,所有日志消息到达 django 记录器何时 DEBUGTrue 发送到控制台(除非您在 LOGGING 设置)。

  • 使用时 RequestContext ,现在可以使用 {{% if 'someapp.someperm' in perms %}} 在模板中。

  • 不再需要了 404.html500.html 根模板目录中的模板。当找不到这些模板时,Django将为这两种情况输出一些基本的错误消息。为了向用户呈现漂亮的错误页面,我们仍然建议提供这些模板作为良好的实践。

  • django.contrib.auth provides a new signal that is emitted whenever a user fails to login successfully. See user_login_failed

  • 新的 loaddata --ignorenonexistent 选项忽略不再存在的字段的数据。

  • assertXMLEqual()assertXMLNotEqual() 新断言允许您在语义级别测试XML内容的相等性,而不考虑语法差异(空格、属性顺序等)。

  • 当远程用户头在同一浏览器会话期间消失时,RemoteUserMiddleware现在强制注销。

  • 这个 cache-based session backend 可以将会话数据存储在非默认缓存中。

  • 现在可以在模型上创建多列索引。请阅读 index_together 文档以获取更多信息。

  • 在Django的日志配置期间,将启用详细的取消预测警告,并将警告捕获到日志系统中。记录的警告通过 console 日志处理程序,默认情况下需要 DEBUG 对于要生成的输出为真。其结果是,在开发环境中,应将DeprecationWarnings打印到控制台上,就像在Python版本<2.7中一样。

  • API django.contrib.admin.ModelAdmin.message_user() 方法已修改为接受其他参数,添加类似于 django.contrib.messages.add_message() . 这对于从管理操作生成错误消息很有用。

  • 由于新的 django.contrib.admin.ModelAdmin.get_list_filter() 方法。

1.5中的向后不兼容变化

警告

除了本节概述的更改外,请务必查看 deprecation plan 对于任何已删除的功能。如果您没有在取消预测时间线内更新给定功能的代码,则删除该功能可能会显示为向后不兼容的更改。

ALLOWED_HOSTS 生产所需

新的 ALLOWED_HOSTS 设置验证请求的 Host 防止主机中毒攻击。现在每当 DEBUGFalse 否则 django.http.HttpRequest.get_host() 将提高 SuspiciousOperation . 有关更多详细信息,请参阅 full documentation 对于新设置。

抽象模型的管理者

抽象模型能够定义一个定制的管理器,而这个管理器 will be inherited by any concrete models extending the abstract model . 但是,如果您尝试使用抽象模型调用管理器上的方法,那么现在将引发异常。以前,调用是允许的,但一旦尝试任何数据库操作(通常数据库中出现“table does not exist”错误),调用就会失败。

如果您在使用抽象类调用的管理器上具有功能,那么应该将该逻辑迁移到Python staticmethodclassmethod 在抽象类上。

年归档类视图中的上下文

为了与其他基于日期的通用视图保持一致, YearArchiveView 现在通过 year 在上下文中作为 datetime.date 而不是一个字符串。如果您正在使用 {{{{ year }}}} 在模板中,必须将其替换为 {{{{ year|date:"Y" }}}} .

next_yearprevious_year 在上下文中也添加了。它们是根据 allow_emptyallow_future .

基于年和月存档类视图中的上下文

YearArchiveViewMonthArchiveView 被记录为提供了 date_list 在上下文中按升序排序,就像它们基于函数的前身一样,但实际上是降序的。在1.5版中,恢复了记录在案的顺序。您可能想要添加(或删除) reversed 关键字 date_list 在模板中:

{% for date in date_list reversed %}

ArchiveIndexView 仍然提供 date_list 按降序排列。

模板视图中的上下文

为了与其他通用视图的设计保持一致, TemplateView 不再通过 params 将变量从urlconf直接传递到上下文中。

HTTP请求中的非表单数据

request.POST 将不再包含通过HTTP请求发布的数据,并且头中包含非表单特定的内容类型。在以前的版本中,使用内容类型而不是 multipart/form-dataapplication/x-www-form-urlencoded 最终仍将代表 request.POST 属性。希望访问这些案例的原始日志数据的开发人员应使用 request.body 改为属性。

request_finished 信号

Django过去经常发送 request_finished 一旦视图函数返回响应,立即发出信号。这与 streaming responses 这会延迟内容生成。

此信号现在在内容被WSGi网关完全消耗之后发送。如果在将响应内容发送到客户机之前依赖于被激发的信号,那么这可能是向后不兼容的。如果你这样做,你应该考虑使用 middleware 相反。

备注

一些WSGi服务器和中间件并不总是调用 close 在处理请求后的响应对象上,最显著的是1.2.6之前的uwsgi和2.0.7之前的sentry错误报告中间件。在这些情况下, request_finished 信号根本不发送。这可能导致到数据库和memcache服务器的空闲连接。

选项,在测试客户机中放置和删除请求

与get和post不同,这些HTTP方法不是由Web浏览器实现的。相反,它们在API中使用,API以各种格式(如JSON或XML)传输数据。由于此类请求可能包含任意数据,Django不会尝试对其主体进行解码。

但是,测试客户机用于为选项构建一个查询字符串,并删除诸如get之类的请求,以及诸如post之类的put请求的请求主体。这种编码是任意的,并且在接收请求时与Django的行为不一致,因此在Django 1.5中删除了它。

如果你在使用 data 参数在选项或删除请求中,必须将其转换为查询字符串并将其附加到 path 参数。

如果你在使用 data 不带参数的Put请求中的参数 content_type ,必须先对数据进行编码,然后再将其传递给测试客户端并设置 content_type 参数。

系统版本 simplejson 不再使用

As explained below ,Django 1.5折旧 django.utils.simplejson 支持python 2.6的内置 json 模块。理论上,这种变化是无害的。不幸的是,由于 simplejson ,在某些情况下可能会触发错误。

django 1.4中的json相关功能始终使用 django.utils.simplejson . 这个模块实际上是:

  • 的系统版本 simplejson ,如果有可用的(即 import simplejson 作品),如果它比Django的内置副本更新,或者它有C加速,或者

  • 这个 json 来自标准库的模块(如果可用)(例如,Python2.6或更高版本),或者

  • 版本2.0.7的内置副本 simplejson .

在Django1.5中,这些特性使用了Python的 json 模块,基于版本2.0.9 simplejson .

Django的版本2.0.7和Python的版本2.0.9之间没有已知的不兼容性。但是,其他版本的 simplejson

  • simplejson API被记录为总是返回Unicode字符串,可选的C实现可以返回bytestring。Python2.7修复了这个问题。

  • simplejson.JSONEncoder 获得了 namedtuple_as_object 2.2版中的关键字参数。

有关这些不兼容的更多信息,请参阅 ticket #18023 .

最终结果是,如果安装了 simplejson 您的代码直接使用Django的序列化内部构件——例如 django.core.serializers.json.DjangoJSONEncoder ,从 simplejsonjson 可能会破坏您的代码。(一般来说,对内部的更改没有文档记录;我们在这里做了一个例外。)

此时,Django的维护人员认为 json 从标准库提供了向后兼容性的最强保证。他们建议从现在开始使用它。

哈希方法参数的字符串类型

如果你写了 custom password hasher 你的 encode()verify()safe_summary() 方法应接受Unicode参数 (passwordsaltencoded )如果任何哈希方法需要字节字符串,则可以使用 force_bytes() 用于对字符串进行编码的实用程序。

验证上一个页码和下一个页码

使用时 object pagination , the previous_page_number()next_page_number() 方法 Page 对象未检查返回的数字是否在现有页范围内。它现在确实检查了一下,并提出了一个 InvalidPage 数字太低或太高时出现异常。

PostgreSQL上自动提交数据库选项的行为已更改

postgresql的autocommit选项并没有像之前所宣传的那样工作。它确实适用于单事务块,但在第一个块离开后,自动提交行为永远不会恢复。这个bug现在在1.5中修复。虽然这只是一个错误修复,但如果您将PostgreSQL与autocommit选项一起使用,则有必要检查应用程序的行为。

会话未保存在500个响应上

如果响应的状态代码为500,Django的会话中间件将跳过保存会话数据。

对失败的管理员登录进行电子邮件检查

在django 1.5之前,如果您试图登录到管理界面,并错误地使用了您的电子邮件地址而不是您的用户名,则管理界面将提供警告,提示您的电子邮件地址不是您的用户名。在Django 1.5中,介绍了 custom user models 需要删除此警告。这不会更改管理站点的登录行为;它只影响在登录失败的特定模式下显示的警告消息。

测试执行中的更改

在执行测试时引入了一些可能与某些测试设置向后不兼容的更改:

数据库刷新 django.test.TransactionTestCase

以前,测试数据库被截断 之前 在一个 TransactionTestCase .

为了能够以任何顺序运行单元测试,并确保它们始终彼此隔离, TransactionTestCase 现在将重置数据库 之后 而是每次测试运行。

不再隐式DB序列重置

TransactionTestCase 用于自动重置主键序列的测试以及上面描述的数据库刷新操作。

这已更改,因此没有隐式重置序列。这可能导致 TransactionTestCase 依赖硬编码的主键值进行中断的测试。

新的 reset_sequences 属性可用于强制 TransactionTestCase 可能需要它。

试验顺序

为了确保 TestCase 代码从一个干净的数据库开始,测试现在按以下顺序执行:

  • 首先,所有单元测试(包括 unittest.TestCaseSimpleTestCaseTestCaseTransactionTestCase )运行时,其中没有特定的命令保证或强制执行。

  • 然后运行任何其他测试(例如doctests),这些测试可能会在不将数据库恢复到原始状态的情况下更改数据库。

这不会导致任何问题,除非您有假定 TransactionTestCase 在前面执行时,留下了一些数据库状态,或者单元测试依赖于在执行其他测试之后保留的某种形式的状态。这种测试已经非常脆弱,现在必须进行更改才能独立运行。

cleaned_data 为无效表格保留的词典

这个 cleaned_data 字典现在总是在表单验证之后出现。当表单不验证时,它只包含通过验证的字段。您应该使用 is_valid() 方法,而不是存在或不存在 cleaned_data 窗体上的属性。

行为 syncdb 有多个数据库

syncdb 现在查询数据库路由器以确定内容类型(何时 contenttypes 启用)和权限(当 auth 应在目标数据库中创建。以前,它在默认数据库中创建它们,即使使用 --database 选择权。

如果你使用 syncdb 在多个数据库上,您应该确保路由器只允许将内容类型和权限同步到其中一个数据库。查看文档 behavior of contrib apps with multiple databases 更多信息。

XML反序列化程序将不分析具有DTD的文档

为了防止暴露于与外部实体引用和实体扩展相关的拒绝服务攻击,XML模型反序列化程序现在拒绝解析包含DTD(doctype定义)的XML文档。由于XML序列化程序不输出DTD,因此这不会影响典型的用法,只有在自定义创建的XML文档被传递到Django的模型反序列化程序的情况下。

表单集默认值 max_num

默认值为 None 对于 max_num 表单集工厂的参数不再默认为允许表单集中有任意数量的表单。相反,为了防止内存耗尽攻击,它现在默认为1000种形式。通过显式设置更高的 max_num .

其他

  • django.forms.ModelMultipleChoiceField 现在返回一个空的 QuerySet 作为空值而不是空列表。

  • int_to_base36() 适当提高 TypeError 而不是 ValueError 对于非整数输入。

  • 这个 slugify 模板过滤器现在可以作为标准的python函数在 django.utils.text.slugify() . 同样地, remove_tags 可在 django.utils.html.remove_tags() .

  • 默认情况下,上载的文件不再创建为可执行文件。如果您需要它们是可执行的更改 FILE_UPLOAD_PERMISSIONS 满足你的需要。新的默认值是 0o666 (八进制)和当前umask值首先被屏蔽。

  • 这个 F expressions 支持位运算符 &| . 这些操作员现在可以使用 .bitand().bitor() 相反。除去 &| 是为了符合 Q() expressionsQuerySet 组合运算符用作布尔和或运算符的位置。

  • 在一个 filter() 调用时 F expressions 包含跨越多值关系的查找,它们并不总是与同一链上的其他查找重复使用相同的关系。这已更改,现在f()表达式将始终使用与同一个中的其他查找相同的关系 filter() 调用。

  • 这个 csrf_token 模板标记不再包含在DIV中。如果需要针对pre-html5严格的DTD进行HTML验证,则应在页面中围绕它添加一个DIV。

  • 模板标记库 adminmedia ,其中只包含已弃用的模板标记 {{% admin_media_prefix %}} 被移除了。正在尝试加载 {{% load adminmedia %}} 会失败。如果模板仍然包含该行,则必须将其删除。

  • 由于实施监督,可以使用 django.contrib.redirects 不启用 django.contrib.sites . 这是不允许的。如果你在用 django.contrib.redirects 确定 INSTALLED_APPS 包含 django.contrib.sites .

  • BoundField.label_tag 现在逃离它 contents 参数。要避免HTML转义,请使用 django.utils.safestring.mark_safe() 在传递之前。

  • 访问通过获取的反向一对一关系 select_related() 现在提出 DoesNotExist 而不是返回 None .

1.5中不推荐的功能

django.contrib.localflavor

localflavor contrib应用程序已拆分为单独的包。 django.contrib.localflavor 在加速折旧后,其本身将在Django 1.6中移除。

新软件包在GitHub上可用。核心团队无法长期有效地维护这些包——目前它只跨越十几个国家;与翻译类似,维护工作将移交给社区中感兴趣的成员。

django.contrib.markup

Markup Contrib模块已被弃用,将遵循加速弃用计划。直接使用python标记库或第三方标记库优于django在框架中维护此功能。

AUTH_PROFILE_MODULE

随着 custom user models ,不再需要内置机制来存储用户配置文件数据。

您仍然可以定义与用户模型有一对一关系的用户配置文件模型-事实上,对于许多需要将数据与用户帐户关联的应用程序,这将是一个适当的设计模式。然而, AUTH_PROFILE_MODULE 设置,以及 django.contrib.auth.models.User.get_profile() 不应再使用访问用户配置文件模型的方法。

流行为 HttpResponse

Django1.5通过将迭代器传递给 HttpResponse . 如果您依赖此行为,请切换到 StreamingHttpResponse . 见 明确支持流响应 上面。

在django 1.7及更高版本中,迭代器将被 HttpResponse .

django.utils.simplejson

由于django 1.5放弃了对python 2.5的支持,我们现在可以依赖 json 模块在Python的标准库中可用,因此我们删除了自己的 simplejson . 现在应该导入 json 而不是 django.utils.simplejson .

不幸的是,由于 simplejson --见 backwards-incompatible changes 部分。如果您依赖添加到 simplejson 当它变成 Python 的 json ,您应该导入 simplejson 明确地。

django.utils.encoding.StrAndUnicode

这个 django.utils.encoding.StrAndUnicode 混入已被弃用。定义一个 __str__ 方法和应用 django.utils.encoding.python_2_unicode_compatible 改为装饰。

django.utils.itercompat.product

这个 django.utils.itercompat.product 函数已被弃用。使用内置 itertools.product() 相反。

cleanup 管理指挥部

这个 cleanup 管理命令已被弃用并替换为 clearsessions .

daily_cleanup.py 脚本

无证件者 daily_cleanup.py 脚本已被弃用。使用 clearsessions 而是管理命令。