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的其他显著新功能包括:
Support for saving a subset of model's fields - Model.save()
现在接受一个 update_fields
参数,允许您指定在调用时将哪些字段写回数据库 save()
. 这可以帮助进行高并发操作,并可以提高性能。
更好 support for streaming responses 通过新的 StreamingHttpResponse
响应类。
GeoDjango 现在支持Postgis2.0。
…以及更多; see below .
在可能的情况下,我们尝试以向后兼容的方式根据 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下删除该行即可。
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版本。
Django1.5引入了对python 3的支持,特别是对python 3.2及更高版本的支持。它的形式是 单一的 代码库;您不需要在python 3上安装不同版本的django。这意味着您可以编写仅针对Python2、仅针对Python3或支持这两个平台的单个应用程序的应用程序。
然而,我们现在将这种支持标记为“实验性的”:虽然它通过我们的自动化测试套件得到了广泛的测试,但它得到的实际测试很少。我们已经尽了最大努力消除了bug,但我们不能确定是否涵盖了Django的所有可能用途。
Django的某些功能不可用,因为它们依赖于尚未移植到python 3的第三方软件,包括:
mysql数据库后端(取决于mysqldb)
ImageField
(取决于PIL)
LiveServerTestCase
(取决于Selenium WebDriver)
此外,Django不仅仅是一个Web框架;它是一个可插入组件的生态系统。此时,很少有第三方应用程序被移植到python 3,因此现实世界中的应用程序不太可能在python 3下满足所有的依赖关系。
因此,我们建议Django1.5不要在Python3下的生产中使用。相反,利用这个机会开始将应用程序移植到Python3。如果您是可插拔组件的作者,我们建议您现在就开始移植。
我们计划在下一个版本django 1.6中为python 3提供一流的、生产就绪的支持。
在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_model
和 for_concrete_models
. 旁路 False
使用此参数现在可以检索 ContentType
与代理模型关联。
view
基于类的视图上下文中的变量¶总共 generic class-based views (或继承自的任何基于类的视图) ContextMixin
)上下文字典包含 view
指向的变量 View
实例。
LineString
和 MultiLineString
geos对象现在支持 interpolate()
和 project()
方法(所谓的线性引用)。
这个 wkb
和 hex
性质 GEOSGeometry
对象保留Z尺寸。
增加了对Postgis2.0的支持,放弃了对gdal<1.5的支持。
添加到文档中的内容包括 Tutorial 3 和一个新的 tutorial on testing . 新的部分“高级教程”提供 How to write reusable apps 以及在 Writing your first patch for Django .
Django 1.5还包括一些较小的改进,值得注意:
模板引擎现在解释 True
, False
和 None
作为相应的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_URL
和 LOGIN_REDIRECT_URL
设置现在也接受视图函数名和 named URL patterns . 这允许您减少配置重复。更多信息可在 login_required()
文档。
Django现在提供了一个mod wsgi auth handler .
这个 QuerySet.delete()
和 Model.delete()
在某些情况下,现在可以走捷径。快速路径允许更少的查询和更少的对象被提取到内存中。见 QuerySet.delete()
有关详细信息。
的实例 ResolverMatch
在请求中存储为 resolver_match
.
默认情况下,所有日志消息到达 django
记录器何时 DEBUG
是 True
发送到控制台(除非您在 LOGGING
设置)。
使用时 RequestContext
,现在可以使用 {{% if 'someapp.someperm' in perms %}}
在模板中。
不再需要拥有 404.html
和 500.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()
. 这对于从管理操作生成错误消息很有用。
警告
除了本节概述的更改外,请务必查看 deprecation plan 对于任何已删除的功能。如果您没有在取消预测时间线内更新给定功能的代码,则删除该功能可能会显示为向后不兼容的更改。
ALLOWED_HOSTS
生产所需¶新的 ALLOWED_HOSTS
设置验证请求的 Host
防止主机中毒攻击。现在每当 DEBUG
是 False
否则 django.http.HttpRequest.get_host()
将提高 SuspiciousOperation
. 有关更多详细信息,请参阅 full documentation
对于新设置。
抽象模型能够定义一个定制的管理器,而这个管理器 will be inherited by any concrete models extending the abstract model . 但是,如果您尝试使用抽象模型调用管理器上的方法,那么现在将引发异常。以前,调用是允许的,但一旦尝试任何数据库操作(通常数据库中出现“table does not exist”错误),调用就会失败。
如果您在使用抽象类调用的管理器上具有功能,那么应该将该逻辑迁移到Python staticmethod
或 classmethod
在抽象类上。
为了与其他基于日期的通用视图保持一致, YearArchiveView
现在通过 year
在上下文中作为 datetime.date
而不是一个字符串。如果您正在使用 {{{{ year }}}}
在模板中,必须将其替换为 {{{{ year|date:"Y" }}}}
.
next_year
和 previous_year
在上下文中也添加了。它们是根据 allow_empty
和 allow_future
.
YearArchiveView
和 MonthArchiveView
被记录为提供了 date_list
在上下文中按升序排序,就像它们基于函数的前身一样,但实际上是降序的。在1.5版中,恢复了记录在案的顺序。您可能想要添加(或删除) reversed
关键字 date_list
在模板中:
{% for date in date_list reversed %}
ArchiveIndexView
仍然提供 date_list
按降序排列。
为了与其他通用视图的设计保持一致, TemplateView
不再通过 params
将变量从urlconf直接传递到上下文中。
request.POST
将不再包括通过Header中具有非特定表单内容类型的HTTP请求发布的数据。在早期版本中,发布的数据包含除 multipart/form-data 或 application/x-www-form-urlencoded 最终仍然会出现在 request.POST
属性希望访问这些情况的原始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实现可以返回字节串。这在Python 2.7中得到了修复。
simplejson.JSONEncoder
获得了 namedtuple_as_object
2.2版中的关键字参数。
有关这些不兼容性的更多信息,请参阅 ticket #18023 。
最终结果是,如果安装了 simplejson
您的代码直接使用Django的序列化内部构件——例如 django.core.serializers.json.DjangoJSONEncoder
,从 simplejson
到 json
可能会破坏您的代码。(一般来说,对内部的更改没有文档记录;我们在这里做了一个例外。)
此时,Django的维护人员认为 json
从标准库提供了向后兼容性的最强保证。他们建议从现在开始使用它。
如果你写了 custom password hasher 你的 encode()
, verify()
或 safe_summary()
方法应接受Unicode参数 (password
, salt
或 encoded
)如果任何哈希方法需要字节字符串,则可以使用 force_bytes()
用于对字符串进行编码的实用程序。
使用时 object pagination , the previous_page_number()
和 next_page_number()
方法 Page
对象未检查返回的数字是否在现有页范围内。它现在确实检查了一下,并提出了一个 InvalidPage
数字太低或太高时出现异常。
postgresql的autocommit选项并没有像之前所宣传的那样工作。它确实适用于单事务块,但在第一个块离开后,自动提交行为永远不会恢复。这个bug现在在1.5中修复。虽然这只是一个错误修复,但如果您将PostgreSQL与autocommit选项一起使用,则有必要检查应用程序的行为。
如果响应的状态代码为500,Django的会话中间件将跳过保存会话数据。
在django 1.5之前,如果您试图登录到管理界面,并错误地使用了您的电子邮件地址而不是您的用户名,则管理界面将提供警告,提示您的电子邮件地址不是您的用户名。在Django 1.5中,介绍了 custom user models 需要删除此警告。这不会更改管理站点的登录行为;它只影响在登录失败的特定模式下显示的警告消息。
在执行测试时引入了一些可能与某些测试设置向后不兼容的更改:
django.test.TransactionTestCase
¶以前,测试数据库被截断 之前 在一个 TransactionTestCase
.
为了能够以任何顺序运行单元测试,并确保它们始终彼此隔离, TransactionTestCase
现在将重置数据库 之后 而是每次测试运行。
TransactionTestCase
用于自动重置主键序列的测试以及上面描述的数据库刷新操作。
这已更改,因此没有隐式重置序列。这可能导致 TransactionTestCase
依赖硬编码的主键值进行中断的测试。
新的 reset_sequences
属性可用于强制 TransactionTestCase
可能需要它。
为了确保 TestCase
代码从一个干净的数据库开始,测试现在按以下顺序执行:
首先,所有单元测试(包括 unittest.TestCase
, SimpleTestCase
, TestCase
和 TransactionTestCase
)运行时,其中没有特定的命令保证或强制执行。
然后运行任何其他测试(例如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(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() expressions 和 QuerySet
组合运算符用作布尔和或运算符的位置。
在一个 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
.
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
而是管理命令。
7月 22, 2024