Django 1.4发行说明

2012年3月23日

欢迎来到Django 1.4!

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

概述

Django1.4中最大的新功能是 support for time zones 处理日期/时间时。启用后,此django将以UTC格式存储日期/时间,在内部使用时区感知对象,并将其转换为用户的本地时区进行显示。

如果要将现有项目升级到django 1.4,切换到时区感知模式可能需要注意:新模式不允许某些以前被接受的相当草率的行为。我们鼓励任何正在升级的人查看 timezone migration guide 以及 timezone FAQ 对于有用的指针。

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

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

python兼容性

Django1.4已经放弃了对python 2.4的支持。python 2.5现在是所需的最低python版本。Django在python 2.5、2.6和2.7上进行测试和支持。

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

Django目前不支持Python3.x。在django 1.4发布之前的某个时候,我们计划发布一个文档,概述我们的完整时间线,以取消对python 2.x的预测并转到python 3.x。

Django 1.4的新功能

支持时区

在以前的版本中,Django使用了“幼稚”的日期/时间(即没有关联时区的日期/时间),让每个开发人员来解释给定的日期/时间“真正意味着什么”。这会导致各种与时区相关的微妙错误。

在django 1.4中,您现在可以将django切换到更正确的时区感知模式。在此模式下,Django将日期和时间信息以UTC格式存储在数据库中,在内部使用时区感知的日期时间对象,并将其转换为模板和表单中的最终用户时区。使用此功能的原因包括:

  • 为世界各地的用户定制日期和时间显示。

  • 为数据库的可移植性和互操作性以UTC格式存储日期时间。(此参数不适用于PostgreSQL,因为它已经在django 1.3中存储了带有时区信息的时间戳。)

  • 避免围绕DST转换出现数据损坏问题。

默认情况下,在使用创建的新项目中启用时区支持 startproject . 如果要在现有项目中使用此功能,请阅读 migration guide . 如果你遇到问题,会有帮助的 FAQ .

支持浏览器内测试框架

Django1.4支持与浏览器内测试框架(如 Selenium. 新的 django.test.LiveServerTestCase 基类允许您更全面地测试站点前端和后端之间的交互。见 documentation 更多细节和具体例子。

更新了默认项目布局和 manage.py

Django 1.4提供更新的默认项目布局和 manage.py 文件为 startproject 管理命令。这些解决了以前的一些问题 manage.py 处理导致双重导入的python导入路径、从开发到部署的问题以及其他难以调试的路径问题。

以前的 manage.py 调用了现在已弃用的函数,因此升级到django 1.4的项目应更新它们的 manage.py . (旧文体) manage.py 将继续工作,直到Django 1.6。在1.5中,它将上升 DeprecationWarning

新推荐 manage.py 文件应如下所示:

#!/usr/bin/env python
import os, sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name }}.settings")

    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)

{{{{ project_name }}}} 应替换为实际项目的python包名称。

如果设置,则使用项目名称前缀(例如 myproject.settingsROOT_URLCONF = "myproject.urls" 等等),新的 manage.py 将需要向上移动一个目录,因此它位于项目包之外,而不是与 settings.pyurls.py .

例如,具有以下布局:

manage.py
mysite/
    __init__.py
    settings.py
    urls.py
    myapp/
        __init__.py
        models.py

你可以导入 mysite.settingsmysite.urlsmysite.myapp ,但不是 settingsurlsmyapp 作为顶级模块。

作为顶级模块导入的任何内容都可以放置在新的 manage.py 。例如,要实现脱钩 myapp 从项目模块中,将其导入为 myapp ,将其放置在 mysite/ 目录:

manage.py
myapp/
    __init__.py
    models.py
mysite/
    __init__.py
    settings.py
    urls.py

如果相同的代码导入不一致(有些地方带有项目前缀,有些地方没有),则在切换到新的代码时需要清除导入内容。 manage.py .

自定义项目和应用程序模板

这个 startappstartproject 管理命令现在有一个 --template 用于指定自定义应用程序或项目模板的路径或URL的选项。

例如,Django将使用 /path/to/my_project_template 当您运行以下命令时,请执行以下操作:

django-admin.py startproject --template=/path/to/my_project_template myproject

现在还可以将目标目录作为第二个参数提供给 startappstartproject

django-admin.py startapp myapp /path/to/new/app
django-admin.py startproject myproject /path/to/new/project

有关详细信息,请参阅 startappstartproject 文档。

改进的WSGi支持

这个 startproject 管理命令现在添加 wsgi.py 初始项目布局的模块,包含可用于 deploying with WSGI app servers .

这个 built-in development server 现在支持使用外部定义的wsgi可调用文件,这使得它可以运行 runserver 使用与部署相同的wsgi配置。新的 WSGI_APPLICATION 通过设置,可以配置哪些wsgi可调用 runserver 使用。

(The runfcgi 管理命令还内部包装通过 WSGI_APPLICATION

SELECT FOR UPDATE 支持

Django 1.4包括 QuerySet.select_for_update() 方法,它生成 SELECT ... FOR UPDATE SQL查询。这将锁定行,直到事务结束,这意味着其他事务无法修改或删除与 FOR UPDATE 查询。

有关更多详细信息,请参阅 select_for_update() .

Model.objects.bulk_create 在ORM中

此方法允许您更高效地创建多个对象。如果有许多对象,它会导致性能显著提高。

Django在内部使用这一点,这意味着一些操作(如测试套件的数据库设置)因此获得了性能优势。

bulk_create() 有关详细信息,请参阅文档。

改进密码哈希

Django的认证系统 (django.contrib.auth )使用单向算法存储密码。Django 1.3使用 SHA1 算法,但不断提高的处理器速度和理论攻击表明,sha1并不像我们希望的那样安全。因此,django 1.4引入了一个新的密码存储系统:默认情况下,django现在使用 PBKDF2 算法(按照 NIST) . 您也可以轻松地选择不同的算法(包括 bcrypt 算法。有关详细信息,请参阅 Django如何存储密码 .

HTML5文档类型

我们已经切换了管理和其他捆绑模板以使用HTML5 doctype。虽然Django会小心地保持与旧浏览器的兼容性,但这种更改意味着您可以在管理页面中使用所需的任何HTML5功能,而不必丢失HTML有效性或重写提供的模板来更改doctype。

在管理界面中列出筛选器

在Django 1.4之前, admin 应用程序允许您通过指定字段查找来指定更改列表筛选器,但它不允许您创建自定义筛选器。这已经用一个简单的API(以前在内部使用,称为“filterspec”)进行了修正。有关更多详细信息,请参阅 list_filter .

管理界面中的多个排序

管理员更改列表现在支持对多个列进行排序。它尊重 ordering 属性和通过单击标题对多个列进行排序是为了模仿桌面GUI的行为而设计的。我们还增加了一个 get_ordering() 动态指定排序的方法(即,取决于请求)。

新的 ModelAdmin 方法

我们增加了一个 save_related() 方法到 ModelAdmin 以便于自定义相关对象在管理中的保存方式。

另外两个新的 ModelAdmin 方法, get_list_display()get_list_display_links() 启用显示在管理更改列表上的字段和链接的动态自定义。

管理内联尊重用户权限

管理内联现在只允许用户有权限的那些操作。为了 ManyToMany 与自动创建的中间模型(没有自己的权限)的关系,相关模型的更改权限决定用户是否具有添加、更改或删除关系的权限。

加密签名工具

Django 1.4添加了用于签名值的低级API和用于设置和读取已签名Cookie的高级API,这是Web应用程序中最常见的签名用途之一。

cryptographic signing 有关详细信息,请参阅文档。

新表单向导

以前的 FormWizarddjango.contrib.formtools 已替换为基于django 1.3中引入的基于类的视图的新实现。它具有可插入的存储API,并且不需要向导为前面的每个步骤传递隐藏字段。

Django1.4带有基于会话的存储后端和基于cookie的存储后端。后者使用工具 cryptographic signing Django1.4中还引入了将向导状态存储在用户cookies中的功能。

reverse_lazy

延迟评估的版本 reverse() 添加以允许在加载项目的urlconf之前使用url反转。

转换URL模式

Django现在可以在使用新的语言时在urlpattern中查找语言前缀。 i18n_patterns() 帮助程序函数。现在还可以使用 django.utils.translation.ugettext_lazy() . 见 国际化:在URL模式中 有关语言前缀和如何国际化URL模式的详细信息。

上下文翻译支持 {{% trans %}}{{% blocktrans %}}

这个 contextual translation Django 1.3通过 pgettext 函数已扩展到 transblocktrans 使用新的模板标记 context 关键字。

可定制的 SingleObjectMixin 乌尔康夫克沃斯

两个新属性, pk_url_kwargslug_url_kwarg ,已添加到 SingleObjectMixin 启用用于单个对象通用视图的urlconf关键字参数的自定义。

工作分配模板标记

一个新的 assignment_tag 帮助程序函数已添加到 template.Library 以简化在指定上下文变量中存储数据的模板标记的创建。

*args**kwargs 支持模板标记帮助器函数

这个 simple_taginclusion_tag 新引进的 assignment_tag 模板助手函数现在可以接受任意数量的位置或关键字参数。例如::

@register.simple_tag
def my_tag(a, b, *args, **kwargs):
    warning = kwargs["warning"]
    profile = kwargs["profile"]
    ...
    return ...

然后,在模板中,可以将任意数量的参数传递给模板标记。例如:

{% my_tag 123 "abcd" book.title warning=message|lower profile=user.profile %}

不包含异常 TEMPLATE_DEBUG 模式

在先前版本的django中,每当 TEMPLATE_DEBUG 设置是 True ,在模板呈现期间引发的任何异常(甚至与模板语法无关的异常)都包装在 TemplateSyntaxError 并重新提出。这样做是为了在Debug500页面中提供详细的模板源位置信息。

在django 1.4中,异常不再被包装。相反,原始异常是用源信息注释的。这意味着从模板呈现中捕获异常现在是一致的,不管 TEMPLATE_DEBUG 不需要抓取和打开 TemplateSyntaxError 以便捕获其他错误。

truncatechars 模板滤波器

此新筛选器将字符串截断为不超过指定的字符数。截断的字符串以可翻译省略号序列(“…”)结尾。参见文档 truncatechars 了解更多详细信息。

static 模板标签

这个 staticfiles Conrib应用程序有了一个新的 static 模板标记,以引用与 STATICFILES_STORAGE 存储后端。它使用存储后端的 url 方法,因此支持高级功能,如 serving files from a cloud service

CachedStaticFilesStorage 存储后端

这个 staticfiles Contrib应用程序现在有一个 django.contrib.staticfiles.storage.CachedStaticFilesStorage 缓存其保存的文件的后端(运行 collectstatic 管理命令)。例如,文件 css/styles.css 也将另存为 css/styles.55e7cbb9ba48.css

简单的点击保护

我们添加了一个中间件,可以轻松地防止 clickjacking 使用 X-Frame-Options 标题。由于向后兼容性的原因,它在默认情况下没有启用,但您几乎肯定希望 enable it 帮助插入支持头部的浏览器的安全漏洞。

CSRF改进

我们对CSRF功能做了各种改进,包括 ensure_csrf_cookie() decorator,可以帮助处理Ajax重站点;保护Put和Delete请求;以及 CSRF_COOKIE_SECURECSRF_COOKIE_PATH 设置,可以提高CSRF保护的安全性和实用性。见 CSRF docs 更多信息。

错误报告筛选

我们增加了两个功能修饰符, sensitive_variables()sensitive_post_parameters() ,以允许指定局部变量和post参数,这些变量可能包含敏感信息,应该从错误报告中筛选出来。

现在,系统地从某些视图的错误报告中筛选出所有post参数。 (loginpassword_reset_confirmpassword_changeadd_view 在里面 django.contrib.auth.views 以及 user_change_password 在管理应用程序中)防止敏感信息(如用户密码)泄漏。

您可以通过编写一个 custom filter . 有关更多信息,请参阅 Filtering error reports .

扩展的IPv6支持

Django 1.4现在可以更好地处理新的IPv6地址 GenericIPAddressField 模型场, GenericIPAddressField 表单域和验证程序 validate_ipv46_addressvalidate_ipv6_address .

测试中的HTML比较

中的基类 django.test 现在,有一些帮助者可以比较HTML,而不会忽略空白、引述/排序参数和结束自结束标记之间的不相关差异。您可以直接将HTML与新的 assertHTMLEqual()assertHTMLNotEqual() 断言,或使用 html=True 旗带 assertContains()assertNotContains() 测试客户端的响应是否包含给定的HTML片段。见 assertions documentation

两个新的日期格式字符串

两新 date 添加了用于模板筛选器、模板标记和 格式本地化

  • e --给定日期时间对象的时区名称

  • o --ISO 8601年号

请确保更新您的 custom format files 如果它们包含 eo 格式字符串。例如,以前的西班牙语本地化格式只转义了 d 设置字符格式:

DATE_FORMAT = r"j \de F \de Y"

但现在它也需要逃脱 eo ::

DATE_FORMAT = r"j \d\e F \d\e Y"

有关详细信息,请参阅 date 文档。

次要特征

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

  • 技术500页中更有用的stacktrace。引用Django框架代码的堆栈跟踪中的帧将变暗,而应用程序代码中的帧将稍微强调。此更改使扫描StackTrace以查找应用程序代码中的问题更加容易。

  • Tablespace support 在PostgreSQL中。

  • 的可自定义名称 simple_tag() .

  • 在文档中, security overview 页。

  • 这个 django.contrib.auth.models.check_password 函数已移动到 django.contrib.auth.hashers 模块。从旧位置导入它仍然有效,但您应该更新导入。

  • 这个 collectstatic 管理命令现在有一个 --clear 选项在复制或链接静态文件之前删除目标中的所有文件。

  • 现在可以在使用mysql和innodb数据库引擎时加载包含前向引用的fixture。

  • 已将新的403响应处理程序添加为 'django.views.defaults.permission_denied' . 您可以通过设置 django.conf.urls.handler403 . 请参阅有关的文档 the 403 (HTTP Forbidden) view 更多信息。

  • 这个 makemessages Command使用了一个新的、更精确的词法分析器, JsLex ,用于从JavaScript文件中提取可翻译的字符串。

  • 这个 trans 模板标记现在接受一个可选的 as 参数来检索转换字符串而不显示它,而是设置模板上下文变量。

  • 这个 if 模板标记现在支持 {{% elif %}} 条款。

  • 如果你的django应用在代理服务器后面,你可能会发现新的 SECURE_PROXY_SSL_HEADER 设置有用。它解决了您的代理“吃”的问题,即请求通过HTTPS传入。但只有当你知道自己在做什么的时候才使用这个设置。

  • 新的纯文本HTTP 500状态代码版本内部错误页在 DEBUGTrue 当Django检测到请求是由javascript代码发起时,将发送到客户端。 (is_ajax() 用于此。)

    与它的HTML对应物一样,它包含一组关于应用程序状态的不同信息。

    当调试与客户端JavaScript的交互时,这应该使阅读更容易。

  • 增加了 makemessages --no-location 选择权。

  • 改变了 locmem 缓存要使用的后端 pickle.HIGHEST_PROTOCOL 为了更好地与其他缓存后端兼容。

  • 在ORM中添加了用于生成的支持 SELECT 包含以下内容的查询 DISTINCT ON .

    这个 distinct() QuerySet 方法现在接受模型字段名称的可选列表。如果指定,则 DISTINCT 语句仅限于这些字段。这仅在PostgreSQL中受支持。

    有关更多详细信息,请参阅 distinct() .

  • 如果您在名称中包含URL,管理员登录页面将添加密码重置链接 'admin_password_reset' 在你的 urls.py ,因此,插入内置的密码重置机制并使其可用现在容易得多。有关详情,请参阅 添加密码重置功能

  • 现在,MySQL数据库后端可以使用由5.0.3版或更新版本的MySQL通过InnoDB存储引擎实现的保存点功能。

  • 现在可以将初始值传递给模型表单,这些表单是从工厂函数返回的模型表单集和内联模型表单集的一部分。 modelformset_factoryinlineformset_factory 分别与常规表单集相同。但是,初始值只适用于额外的表单,即那些未绑定到现有模型实例的表单。

  • 站点地图框架现在可以使用新的 Sitemap.protocol 类属性。

  • 一个新的 django.test.SimpleTestCase 亚类 unittest.TestCase 比…轻 django.test.TestCase 还有公司。它在不需要命中数据库的测试中很有用。见 Django单元测试类的层次结构 .

1.4中的向后不兼容更改

需要密钥设置

用空的或已知的 SECRET_KEY 禁用Django的许多安全保护,并可能导致远程代码执行漏洞。任何Django站点都不应该没有 SECRET_KEY .

在Django 1.4中,用空的 SECRET_KEY 将提高 DeprecationWarning . 在django 1.5中,它将引发一个异常,django将拒绝启动。由于在没有 SECRET_KEY .

django.contrib.admin

包含的管理应用程序 django.contrib.admin 在很长一段时间内附带了一组默认的静态文件,如javascript、图像和样式表。Django 1.3添加了一个新的contrib应用程序 django.contrib.staticfiles 以通用的方式处理这些文件,并为应用程序中包含的静态文件定义约定。

从Django 1.4开始,管理员的静态文件也遵循这一约定,以使文件更易于部署。在以前的Django版本中,定义一个 ADMIN_MEDIA_PREFIX 设置为指向管理员的静态文件在Web服务器上所在的URL。此设置现在已弃用,并被更通用的设置所取代 STATIC_URL 。Django现在可以在URL下找到admin静态文件 <STATIC_URL>/admin/

如果您以前使用过URL路径 ADMIN_MEDIA_PREFIX (例如: /media/ )只需确保 STATIC_URLSTATIC_ROOT 已配置,并且您的Web服务器正确提供这些文件。开发服务器继续提供管理文件,就像以前一样。请阅读 static files howto 了解更多详细信息。

如果你 ADMIN_MEDIA_PREFIX 设置为特定域(例如。 http://media.example.com/admin/ )确保同时设置 STATIC_URL 设置为正确的URL——例如, http://media.example.com/ .

警告

如果您隐式地依赖Django源代码中管理静态文件的路径,则需要更新该路径。文件已从移动 django/contrib/admin/media/django/contrib/admin/static/admin/ .

管理员支持的浏览器

Django还没有明确的管理应用程序支持哪些浏览器的政策。我们的新政策使现有做法正式化: YUI's A-grade 浏览器应该提供全功能的管理体验,除了不再受支持的Internet Explorer 6之外,还有一个显著的例外。

IE6发布于10多年前,它对现代网络开发施加了许多限制。这一政策的实际影响是,贡献者可以自由地改进管理,而不考虑这些限制。

这项新政策 没有影响 使用django开发的网站。它只适用于Django管理员。您可以自由开发与任何浏览器兼容的应用程序。

已删除管理图标

作为改进管理员更改列表排序界面性能和可用性的一部分,以及 horizontalvertical “过滤器”小部件,一些图标文件被删除并分组为两个sprite文件。

明确地: selector-add.gifselector-addall.gifselector-remove.gifselector-removeall.gifselector_stacked-add.gifselector_stacked-remove.gif 合并成 selector-icons.gif ;和 arrow-up.gifarrow-down.gif 合并成 sorting-icons.gif .

如果您使用这些图标自定义管理员,那么您需要用自己的图标替换它们,或者从以前的版本获取文件。

管理窗体中的CSS类名

为了避免与其他常见的CSS类名(例如“button”)冲突,我们在主管理窗体、堆叠的内联窗体和表格的内联单元格中的表单字段名自动生成的所有CSS类名中添加了前缀(“field-”)。如果以前使用普通字段名作为自定义样式或javascript转换的选择器,那么在自定义样式表或javascript文件中需要考虑该前缀。

与旧签名数据的兼容性

Django 1.3更改了在Django许多地方使用的加密签名机制。虽然Django1.3保留了接受以前方法生成的哈希的回退,但这些回退在Django1.4中被删除。

因此,如果直接从1.2或更早版本升级到django 1.4,则可能会丢失/使使用旧方法加密签名的某些数据块失效。为了避免这种情况,请先使用django 1.3一段时间,以允许签名数据自然过期。下面详细介绍了受影响的部分,其中1)忽略此建议的后果,2)运行django 1.3所需的时间,以使数据过期或变得不相关。

  • contrib.sessions 数据完整性检查

    • 结果:用户将被注销,会话数据将丢失。

    • 时间段:定义人 SESSION_COOKIE_AGE .

  • contrib.auth 密码重置哈希

    • 结果:升级前的密码重置链接将不起作用。

    • 时间段:定义者 PASSWORD_RESET_TIMEOUT_DAYS

表单相关哈希:这些哈希的生存期要短得多,仅在短窗口中相关,用户可以填写升级前Django实例生成的表单并尝试将其提交到升级的Django实例:

  • contrib.comments 窗体安全哈希

    • 结果:用户将看到验证错误“安全哈希失败”。

    • 时间段:期望用户填写评论表单的时间量。

  • FormWizard 安全散列

    • 结果:用户将看到有关表单已过期的错误,并将被发送回向导的第一页,丢失迄今为止输入的数据。

    • 时间段:希望用户填写受影响表单的时间量。

  • CSRF检查

    • 注意:这实际上是一个django 1.1回退,而不是django 1.2,它仅适用于从1.1升级的情况。

    • 结果:用户将看到403错误与任何受CSRF保护的post表单。

    • 时间段:您希望用户填写此类表单的时间。

  • contrib.auth 用户密码哈希升级序列

    • 结果:当每个用户的密码在1.4中写入数据库时,它将被更新为更强的密码哈希。这意味着如果升级到1.4,然后需要降级到1.3,1.3版将无法读取更新的密码。

    • 补救措施:设定 PASSWORD_HASHERS 在最初升级到1.4时使用原始密码散列。在你确认你的应用程序与Django1.4很好地配合后,你就不必回滚到1.3了,启用新的密码散列。

django.contrib.flatpages

从1.4开始, FlatpageFallbackMiddleware 仅当生成的URL引用现有的平面图时添加尾随斜杠并重定向。例如,请求 /notaflatpageoravalidurl 在以前的版本中,将重定向到 /notaflatpageoravalidurl/ 这将导致404。请求 /notaflatpageoravalidurl 现在将立即提高404。

此外,通过flatpages返回的重定向现在是永久的(状态代码为301),以匹配 CommonMiddleware .

的序列化 datetimetime

由于时区支持,根据ECMA-262规范,我们对JSON序列化程序进行了更改:

  • 它包括用于感知日期时间对象的时区。它会对感知时间对象引发异常。

  • 它包括日期时间和时间对象的毫秒数。还有一些精度损失,因为python存储微秒(6位),而json只支持毫秒(3位)。但是,它比完全丢弃微秒要好。

我们将XML序列化程序更改为对日期时间使用ISO8601格式。信 T 用于分隔日期部分和时间部分,而不是空格。时区信息包含在 [+-]HH:MM 格式。

尽管序列化程序现在在创建设备时使用这些新格式,但它们仍然可以加载使用旧格式的设备。

supports_timezone 改为 False SQLite

数据库功能 supports_timezone 曾经是 True 对于SQLite。实际上,如果保存了一个感知日期时间对象,则sqlite存储了一个包含UTC偏移量的字符串。但是,当从数据库加载值时,这个偏移量被忽略,这可能会损坏数据。

在时区支持的上下文中,此标志已更改为 False 和datetime现在存储在sqlite中,没有时区信息。什么时候? USE_TZFalse ,如果尝试保存一个感知的日期时间对象,Django将引发一个异常。

MySQLdb -特定例外

MySQL后端在历史上 MySQLdb.OperationalError 当查询触发异常时。我们已经解决了这个问题,现在我们提出 django.db.DatabaseError 相反。如果你在测试 MySQLdb.OperationalError ,您需要更新 except 条款。

数据库连接的线程位置

DatabaseWrapper 对象(即引用的连接对象 django.db.connectiondjango.db.connections["some_alias"] )以前是本地线程。它们现在是全局对象,以便在多个线程之间共享。虽然各个连接对象现在是全局的,但是 django.db.connections 引用这些对象的字典仍然是线程本地的。因此,如果您只是使用ORM或 DatabaseWrapper.cursor() 然后,行为仍然和以前一样。但是,请注意 django.db.connection 不直接引用默认值 DatabaseWrapper 对象,现在是访问该对象属性的代理。如果你需要访问 DatabaseWrapper 使用对象 django.db.connections[DEFAULT_DB_ALIAS] 相反。

作为此更改的一部分,所有底层SQLite连接现在都启用了潜在的线程共享(通过传递 check_same_thread=False 属性为 pysqlite )。 DatabaseWrapper 但是,通过在默认情况下禁用线程共享来保留以前的行为,因此这不会影响任何纯粹依赖ORM或 DatabaseWrapper.cursor()

最后,虽然现在可以在线程之间传递连接,但Django不做任何努力来同步对底层后端的访问。并发行为由底层后端实现定义。查看他们的文档以了解详细信息。

COMMENTS_BANNED_USERS_GROUP 设置

Django的评论在历史上支持排除特殊用户组的评论,但我们从未正确地记录该功能,并且没有在应用程序的其他部分(如模板标签)强制排除。为了解决这个问题,我们从feed类中删除了代码。

如果您依赖该功能并希望恢复旧行为,请使用自定义注释模型管理器排除用户组,如下所示:

from django.conf import settings
from django.contrib.comments.managers import CommentManager


class BanningCommentManager(CommentManager):
    def get_query_set(self):
        qs = super().get_query_set()
        if getattr(settings, "COMMENTS_BANNED_USERS_GROUP", None):
            where = [
                "user_id NOT IN (SELECT user_id FROM auth_user_groups WHERE group_id = %s)"
            ]
            params = [settings.COMMENTS_BANNED_USERS_GROUP]
            qs = qs.extra(where=where, params=params)
        return qs

将此模型管理器保存在自定义注释应用程序中(例如 my_comments_app/managers.py )并将其添加到您的自定义评论应用程序模型中:

from django.db import models
from django.contrib.comments.models import Comment

from my_comments_app.managers import BanningCommentManager


class CommentWithTitle(Comment):
    title = models.CharField(max_length=300)

    objects = BanningCommentManager()

IGNORABLE_404_STARTSIGNORABLE_404_ENDS 设置

在django 1.3之前,可以从django中排除一些URL 404 error reporting 通过向添加前缀 IGNORABLE_404_STARTS 后缀 IGNORABLE_404_ENDS .

在Django 1.4中,这两个设置被取代 IGNORABLE_404_URLS ,这是已编译正则表达式的列表。Django不会发送一封电子邮件,邮件中显示404个与它们匹配的URL错误。

此外,以前的设置有一些相当随意的默认值:

IGNORABLE_404_STARTS = ("/cgi-bin/", "/_vti_bin", "/_vti_inf")
IGNORABLE_404_ENDS = (
    "mail.pl",
    "mailform.pl",
    "mail.cgi",
    "mailform.cgi",
    "favicon.ico",
    ".php",
)

决定你的网站是否有遗产不是Django的职责 /cgi-bin/ 节或A favicon.ico . 因此,默认值为 IGNORABLE_404_URLSIGNORABLE_404_STARTSIGNORABLE_404_ENDS 现在都是空的。

如果你已经定制了 IGNORABLE_404_STARTSIGNORABLE_404_ENDS 或者,如果要保留旧的默认值,则应在设置文件中添加以下行:

import re

IGNORABLE_404_URLS = (
    # for each <prefix> in IGNORABLE_404_STARTS
    re.compile(r"^<prefix>"),
    # for each <suffix> in IGNORABLE_404_ENDS
    re.compile(r"<suffix>$"),
)

不要忘记转义在正则表达式中有特殊意义的字符,例如句点。

CSRF保护扩展到放置和删除

以前,Django的 CSRF protection 仅针对邮政请求提供保护。由于在Ajax应用程序中使用Put和Delete方法变得越来越普遍,我们现在通过 RFC 2616 --也就是说,我们免除了GET、HEAD、OPTIONS和TRACE,并对其他所有内容实施保护。

如果在Ajax应用程序中使用Put或Delete方法,请参见 instructions about using AJAX and CSRF .

密码重置视图现在接受 subject_template_name

这个 password_reset 视图 django.contrib.auth 现在接受 subject_template_name 参数,作为关键字参数传递给密码保存窗体。如果将此视图与自定义密码重置表单一起使用,则需要确保表单的 save() 方法接受此关键字参数。

django.core.template_loaders

这是一个别名 django.template.loader 自2005年以来,我们移除了它,但由于折旧的时间过长,没有发出警告。如果您的代码仍然引用这个,请使用 django.template.loader 相反。

django.db.models.fields.URLField.verify_exists

由于棘手的性能和安全问题,此功能已被删除。任何现有的 verify_exists 应该移除。

django.core.files.storage.Storage.open

这个 open 用于获取模糊参数的基存储类的方法 mixin 这允许您动态地更改返回文件对象的基类。此已删除。在罕见的情况下,你依赖 mixin 参数,您可以通过重写 open 方法,如:

from django.core.files import File
from django.core.files.storage import FileSystemStorage


class Spam(File):
    """
    Spam, spam, spam, spam and spam.
    """

    def ham(self):
        return "eggs"


class SpamStorage(FileSystemStorage):
    """
    A custom file storage backend.
    """

    def open(self, name, mode="rb"):
        return Spam(open(self.path(name), mode))

yaml反序列化程序现在使用 yaml.safe_load

yaml.load 能够构造任何python对象,如果处理来自不受信任源的yaml文档,则可能触发任意代码执行。Django的yaml反序列化程序不需要这个特性,它的主要用途是加载由简单对象组成的设备。尽管设备是可信数据,但是yaml反序列化程序现在使用 yaml.safe_load 为了额外的安全。

会话cookie现在具有 httponly 默认标志

会话Cookie现在包括 httponly 属性,以帮助减少潜在的XSS攻击的影响。此更改的结果是,会话Cookie数据,包括 sessionid 在许多浏览器中,不再可以从JavaScript访问。要实现严格的向后兼容性,请使用 SESSION_COOKIE_HTTPONLY = False 在您的设置文件中。

这个 urlize 过滤器不再逐出每个URL

当URL包含 %xx 序列,在哪里 xx 是两个十六进制数字, urlize 现在假设URL已经被转义,不再应用URL转义。对于未加引号的表单包含 %xx 顺序,但是这样的URL不太可能在野外发生,因为它们也会混淆浏览器。

assertTemplateUsedassertTemplateNotUsed 作为上下文管理器

现在可以检查模板是否在代码块中使用 assertTemplateUsed()assertTemplateNotUsed() . 它们可以用作上下文管理器:

with self.assertTemplateUsed("index.html"):
    render_to_string("index.html")
with self.assertTemplateNotUsed("base.html"):
    render_to_string("index.html")

assertion documentation

运行测试套件后的数据库连接

默认测试运行程序在测试执行后不再恢复数据库连接。这样可以防止生产数据库暴露于仍在运行的潜在线程,并尝试创建新的连接。

如果您的代码依赖于在测试执行后创建的生产数据库的连接,那么您可以通过子类化恢复以前的行为。 DjangoTestRunner 并超越它 teardown_databases() 方法。

产量 manage.py help

manage.py help 现在按应用程序对可用命令进行分组。如果您依赖于这个命令的输出——例如,如果您分析了它——那么您将需要更新代码。要获取脚本中所有可用管理命令的列表,请使用 manage.py help --commands 相反。

extends 模板标签

以前, extends 标记使用了错误的方法来分析参数,这可能导致它错误地将参数视为字符串文字而不是字符串文字。 parser.compile_filter 像其他标签一样。

标签的内部不是官方稳定API的一部分,而是为了全面公开, ExtendsNode.__init__ 定义已更改,这可能会破坏使用此类的任何自定义标记。

装载一些不完整的固定装置不再有效

在1.4之前,当为字段设置auto_now或auto_now_add时,为缺少特定日期或日期时间值的fixture对象插入了默认值。这是不应该起作用的,在1.4中加载这样不完整的固定装置将失败。因为fixture是原始导入,所以它们应该显式指定所有字段值,而不考虑模型上的字段选项。

开发服务器多线程

开发服务器现在默认情况下是多线程的。使用 runserver --nothreading 在开发服务器中禁用线程的选项:

django-admin.py runserver --nothreading

设置安全模式时在标记中禁用的属性

在django 1.4之前,无论过滤器的安全模式设置如何,属性都包含在任何降价输出中。在版本>2.1的python markdown库中,添加了一个启用属性选项。当safe参数传递到markdown筛选器时,两个 safe_mode=Trueenable_attributes=False 设置选项。如果使用的python markdown库版本低于2.1,则会发出一条警告,说明输出不安全。

FormMixin get_initial返回特定于实例的字典

在Django 1.3中, get_initial 方法 django.views.generic.edit.FormMixin 全班都在上课 initial 字典。这已被修复以返回此字典的副本,因此表单实例可以修改其初始数据,而不会与类变量混淆。

1.4中不推荐的功能

旧的通话方式 cache_page 装饰符

一些传统的调用方式 cache_page() 已弃用。请参阅文档以了解使用此修饰符的正确方法。

支持8.2以上的PostgreSQL版本

Django 1.3放弃了对8.0以上的PostgreSQL版本的支持,我们建议使用较新的版本,因为性能得到了改善,更重要的是,8.0和8.1的上游支持期即将结束(2010年11月)。

Django1.4进一步考虑了这一策略,并将8.2设置为其官方支持的最低PostgreSQL版本。

现在总是记录请求异常

当我们添加 logging support 在1.3中的Django中,管理错误电子邮件支持被移动到 django.utils.log.AdminEmailHandler ,附加到 'django.request' 记录器。为了保持错误电子邮件的既定行为,请 'django.request' 只有当 DEBUGFalse .

为了提高请求的错误日志记录的灵活性, 'django.request' 现在,无论 DEBUG ,新项目的默认设置文件现在包含附加到 django.utils.log.AdminEmailHandler 防止管理错误电子邮件进入 DEBUG 模式:

LOGGING = {
    # ...
    "filters": {
        "require_debug_false": {
            "()": "django.utils.log.RequireDebugFalse",
        }
    },
    "handlers": {
        "mail_admins": {
            "level": "ERROR",
            "filters": ["require_debug_false"],
            "class": "django.utils.log.AdminEmailHandler",
        }
    },
}

如果您的项目是在此更改之前创建的,则 LOGGING 设置将不包括此新筛选器。为了保持向后兼容性,Django将检测到 'mail_admins' 处理程序配置不包括 'filters' 并将自动为您添加此筛选器并发出挂起的弃用警告。在Django 1.5中,这将成为一个警告,在Django 1.6中,向后兼容垫片将被完全删除。

任何 'filters' 钥匙下 'mail_admins' 处理程序将禁用此向后兼容填充程序和取消预测警告。

django.conf.urls.defaults

在Django 1.3之前, include()patterns()url() 函数,加上 handler404handler500 位于 django.conf.urls.defaults 模块。

在Django 1.4,他们住在 django.conf.urls .

django.contrib.databrowse

databrowse已经有一段时间没有看到活动的开发,这并没有显示任何变化的迹象。有人建议 GSOC project 将databrowse的功能集成到管理中,但没有任何进展。尽管databrowse已被弃用,但 django.contrib.admin 提供类似的功能集仍然是可能的。

驱动数据浏览的代码与Django本身具有相同的许可条款,因此它可以作为第三方项目被个人或团体采用。

django.core.management.setup_environ

此功能暂时修改 sys.path 为了使父“项目”目录在旧公寓下可导入 startproject 布局。此函数现在已被弃用,因为它的路径解决方案不再需要与新的 manage.py 和默认项目布局。

此函数从未被记录或作为公共API的一部分,但广泛建议在为用户脚本设置“Django环境”时使用。应通过设置 DJANGO_SETTINGS_MODULE 环境变量或使用 django.conf.settings.configure() .

django.core.management.execute_manager

此函数以前由 manage.py 执行管理命令。它与 django.core.management.execute_from_command_line ,除了它首先调用 setup_environ ,现已弃用。像这样的, execute_manager 也被否决; execute_from_command_line 可以改为使用。这两个函数都没有作为公共API的一部分进行记录,但是由于在现有的API中使用,因此需要一个弃用路径。 manage.py 文件夹。

is_safeneeds_autoescape 模板筛选器的属性

两个标识, is_safeneeds_autoescape 定义每个模板过滤器如何与Django的自动转义行为交互。它们曾经是过滤函数的属性:

@register.filter
def noop(value):
    return value


noop.is_safe = True

然而,这项技术在与装饰师结合时,特别是在 @stringfilter . 现在,标志是的关键字参数 @register.filter ::

@register.filter(is_safe=True)
def noop(value):
    return value

filters and auto-escaping 更多信息。

中应用程序名称的通配符扩展 INSTALLED_APPS

直到Django 1.3, INSTALLED_APPS 在应用程序名称中接受通配符,例如 django.contrib.* . 扩展是由基于文件系统的 from <package> import * . 不幸的是,这是不可靠的。

这种行为从未被记录在案。因为它是非韵律的,所以在django1.4中被删除了。如果依赖它,则必须编辑设置文件以显式列出所有应用程序。

HttpRequest.raw_post_data renamed to HttpRequest.body

这个属性的名称很混乱 HttpRequest.raw_post_data 但它实际上提供了HTTP请求的主体。它被重命名为 HttpRequest.bodyHttpRequest.raw_post_data 已弃用。

django.contrib.sitemaps 具有潜在性能影响的错误修复

在以前的版本中, Paginator 网站图类中使用的对象已被缓存,这可能导致网站图过时。我们已经删除了缓存,因此对站点地图的每个请求现在都会创建一个新的paginator对象并调用 items() 方法 Sitemap 子类。取决于你的 items() 方法正在执行,这可能会对性能产生负面影响。要减轻性能影响,请考虑使用 caching framework 在你之内 Sitemap 子类。

2.1之前的python markdown版本

早于2.1的python markdown版本不支持禁用属性的选项。作为一个安全问题,Markup Contrib应用程序在1.5中加速折旧时间表下不支持此库的早期版本。