Django 1.11 发行说明 — Django 文档

来自菜鸟教程
Django/docs/2.2.x/releases/1.11
跳转至:导航、​搜索

Django 1.10 版本发行说明

2017 年 4 月 4 日

欢迎来到 Django 1.11 版本!

这些发行说明涵盖了 新功能 ,以及从 Django 1.10 或更旧版本升级时您需要注意的一些 向后不兼容更改 。 我们已经 开始了某些功能 的弃用过程。

如果您要更新现有项目,请参阅 将 Django 升级到更新版本 指南。

Django 1.11 被指定为 长期支持版本 。 它将在发布后至少三年内收到安全更新。 对之前的 LTS Django 1.8 的支持将于 2018 年 4 月结束。

Python 兼容性

Django 1.11 需要 Python 2.7、3.4、3.5、3.6 或 3.7(从 1.11.17 开始)。 我们【X3X】强烈推荐【X23X】,官方只支持各系列的最新版本。

Django 1.11.x 系列是最后一个支持 Python 2 的。 下一个主要版本 Django 2.0 将仅支持 Python 3.4+。


默认情况下,弃用警告不再响亮

与旧版本的 Django 不同,默认情况下不再显示 Django 自己的弃用警告。 这与 Python 的默认行为一致。

此更改允许第三方应用程序同时支持 Django 1.11 LTS 和 Django 1.8 LTS,而无需添加代码以避免弃用警告。

在 Django 2.0 发布之后,我们建议第三方应用程序作者放弃对 Django 1.11 之前的所有版本的支持。 那时,您应该能够使用 python -Wd 运行包的测试,以便出现弃用警告。 修复弃用警告后,您的应用程序应该与 Django 2.0 兼容。


Django 1.11 中的新功能

基于类的模型索引

新的 django.db.models.indexes 模块包含易于创建数据库索引的类。 使用 Meta.indexes 选项将索引添加到模型中。

Index 类创建了一个 b 树索引,就像您在模型字段上使用 db_index 或在模型 Meta 类上使用 index_together 一样。 它可以被子类化以支持不同的索引类型,例如 GinIndex。 它还允许定义索引列的顺序 (ASC/DESC)。


基于模板的小部件渲染

为了简化小部件的定制,现在使用模板系统而不是 Python 来完成表单小部件的呈现。 参见表单渲染API

您可能需要调整您为一些 向后不兼容的更改 编写的任何自定义小部件。


Subquery 表达式

新的 SubqueryExists 数据库表达式允许创建显式子查询。 子查询可以使用 OuterRef 类引用外部查询集中的字段。


次要特性

django.contrib.admin


django.contrib.auth

  • PBKDF2 密码哈希器的默认迭代计数增加了 20%。
  • LoginViewLogoutView 基于类的视图取代了已弃用的 login()logout() 基于函数的视图。
  • PasswordChangeViewPasswordChangeDoneViewPasswordResetViewPasswordResetDoneViewPasswordResetConfirmView[X151X6]、、、、基于视图取代已弃用的 password_change()password_change_done()password_reset()password_reset_done()password_reset_confirm()password_reset_complete() 函数基于的观点。
  • PasswordResetConfirmView 的新 post_reset_login 属性允许在成功重置密码后自动登录用户。 如果您配置了多个 AUTHENTICATION_BACKENDS,请使用 post_reset_login_backend 属性选择使用哪个。
  • 为了避免通过 HTTP Referer 标头泄露密码重置令牌的可能性(例如,如果重置页面包含对托管在另一个域上的 CSS 或 JavaScript 的引用),PasswordResetConfirmView(但不是已弃用的 [ X250X] 基于函数的视图)将令牌存储在会话中并重定向到自身以向用户呈现密码更改表单,而 URL 中没有令牌。
  • update_session_auth_hash() 现在轮换会话密钥以允许更改密码以使被盗的会话 cookie 无效。
  • LoginViewLogoutView 的新 success_url_allowed_hosts 属性允许指定一组在登录和注销后可安全重定向的主机。
  • 将密码验证器 help_text 添加到 UserCreationForm
  • HttpRequest 现在被传递给 authenticate(),如果它接受 request 参数,它又将它传递给身份验证后端。
  • user_login_failed() 信号现在接收 request 参数。
  • PasswordResetForm 支持自定义用户模型,这些模型使用名为 'email' 以外的名称的电子邮件字段。 将 CustomUser.EMAIL_FIELD 设置为字段名称。
  • get_user_model() 现在可以在导入时调用,即使在定义模型的模块中也是如此。


django.contrib.contenttypes

  • 当在 :djadmin:`remove_stale_contenttypes` 命令中检测到陈旧的内容类型时,现在有一个相关对象列表,例如 auth.Permissions 也将被删除。 以前,只列出了内容类型(并且此提示在 migrate 之后而不是在单独的命令中)。


django.contrib.gis


django.contrib.postgres

  • StringAgg 的新 distinct 参数确定连接的值是否不同。
  • 新的 GinIndexBrinIndex 类允许在数据库中创建 GINBRIN 索引。
  • JSONField 接受一个新的 encoder 参数来指定一个自定义类来编码标准编码器不支持的数据类型。
  • 新的 CIText mixin 和 CITextExtension 迁移操作允许使用 PostgreSQL 的 citext 扩展进行不区分大小写的查找。 提供了三个字段:CICharFieldCIEmailFieldCITextField
  • 新的 JSONBAgg 允许将值聚合为 JSON 数组。
  • HStoreField(模型字段)和 HStoreField(表单字段)允许存储空值。


缓存

  • Memcached 后端现在传递以下内容 :设置:`选项 ` 作为客户端构造函数的关键字参数,允许对客户端行为进行更高级的控制。 有关示例,请参阅 缓存参数 文档。
  • Memcached 后端现在允许将多个服务器定义为逗号分隔的字符串 :设置:`位置 ` ,为了方便在环境变量中使用此类字符串的第三方服务。


CSRF


数据库后端

  • 在 PostgreSQL 9.5+ 和 Oracle 上将 skip_locked 参数添加到 QuerySet.select_for_update() 以使用 FOR UPDATE SKIP LOCKED 执行查询。
  • 添加了 :设置:`测试['模板'] ` 设置让 PostgreSQL 用户指定用于创建测试数据库的模板。
  • QuerySet.iterator() 现在在 PostgreSQL 上使用 服务器端游标 。 此功能将一些工作内存负载(用于保存查询结果)转移到数据库,并可能增加数据库内存使用量。
  • :setting:`OPTIONS` 中添加了对 'isolation_level' 选项的 MySQL 支持,以允许指定 事务隔离级别 。 为避免可能的数据丢失,建议从 MySQL 的默认级别可重复读取切换到已提交读取。
  • 添加了对 cx_Oracle 5.3 的支持。


电子邮件

  • 添加了 :setting:`EMAIL_USE_LOCALTIME` 设置以允许在本地时区而不是 UTC 中发送 SMTP 日期标头。
  • EmailMessage.attach()attach_file() 现在回退到 MIME 类型 application/octet-stream,当为 text/* 附件指定了无法解码为 UTF-8 的二进制内容时。


文件存储

  • 为了使其可被 io.TextIOWrapper 包裹,File 现在具有 readable()writable()seekable() 方法。


表单


国际化


管理命令

  • 新的 loaddata --exclude 选项允许在从灯具加载数据时排除模型和应用程序。
  • 新的 diffsettings --default 选项允许指定一个设置模块而不是 Django 的默认设置进行比较。
  • app_label 的参数现在限制 showmigrations --plan 输出。


迁移

  • 添加了对 uuid.UUID 对象序列化的支持。


模型


请求和响应


序列化

  • 新的 django.core.serializers.base.Serializer.stream_class 属性允许子类自定义默认流。
  • JSON 序列化器 使用的编码器现在可以通过将 cls 关键字参数传递给 serializers.serialize() 函数来自定义。
  • DjangoJSONEncoder 现在序列化 timedelta 对象(由 DurationField 使用)。


模板


测试


验证器


1.10 中的不向后兼容的变更

django.contrib.gis

  • 为了简化代码库并且因为它比 contrib.gis 首次发布时更容易安装,GDAL 现在是 GeoDjango 的必需依赖项。 在旧版本中,只有 SQLite 需要它。
  • contrib.gis.maps 已被移除,因为它与 Google Maps API 的退役版本接口并且似乎没有维护。 如果你正在使用它, :ticket:`让我们知道 <14284>` .
  • GEOSGeometry 相等运算符现在也比较 SRID。
  • 基于 OpenLayers 的表单小部件现在使用 OpenLayers 3,并且更新了 gis/openlayers.htmlgis/openlayers-osm.html 模板。 如果您对这些小部件进行子类化或扩展模板,请检查您的项目。 此外,新小部件的工作方式与旧小部件略有不同。 您不使用小部件中的工具栏,而是单击以绘制、单击并拖动以移动地图,然后单击并拖动一个点/顶点/角以移动它。
  • 不再支持 SpatiaLite < 4.0。
  • 不再支持 GDAL 1.7 和 1.8。
  • contrib.gis.forms.widgets 和管理员的 OpenLayersWidget 中的小部件使用 表单渲染 API 而不是 loader.render_to_string()。 如果您使用自定义小部件模板,则需要确保您的表单渲染器可以找到它。 例如,您可以使用 TemplatesSetting 渲染器。


django.contrib.staticfiles

  • collectstatic 现在在使用散列静态文件存储时,如果存在引用循环(例如 'foo.css' 引用 'bar.css',它本身引用 'foo.css'),或者如果引用其他文件的文件链太深而无法在几遍中解析。 在后一种情况下,使用 ManifestStaticFilesStorage.max_post_process_passes 增加传递次数。
  • 使用 ManifestStaticFilesStorage 时,运行时在清单中找不到的静态文件现在会引发 ValueError,而不是返回未更改的路径。 您可以通过将 ManifestStaticFilesStorage.manifest_strict 设置为 False 来恢复旧行为。


数据库后端 API

本节介绍了第三方数据库后端可能需要的更改。

  • 添加了 DatabaseOperations.time_trunc_sql() 方法以支持 TimeField 截断。 它接受 lookup_typefield_name 参数并返回适当的 SQL 以将给定的时间字段 field_name 截断为仅具有给定特异性的时间对象。 lookup_type 参数可以是 'hour''minute''second'
  • 添加了 DatabaseOperations.datetime_cast_time_sql() 方法以支持 :lookup:`time` 查找。 它接受 field_nametzname 参数并返回将日期时间值转换为时间值所需的 SQL。
  • 要启用 FOR UPDATE SKIP LOCKED 支持,请设置 DatabaseFeatures.has_select_for_update_skip_locked = True
  • 新的 DatabaseFeatures.supports_index_column_ordering 属性指定数据库是否允许为索引中的列定义排序。 默认值为 True 并且 DatabaseIntrospection.get_constraints() 方法应在每个返回的字典中包含一个 'orders' 键,其中包含 'ASC' 和/或 'DESC' 值对应于索引中每一列的排序。
  • :djadmin:`inspectdb` 不再调用已弃用的 DatabaseIntrospection.get_indexes()。 自定义数据库后端应确保 DatabaseIntrospection.get_constraints() 返回所有类型的索引。
  • ignores_quoted_identifier_case 功能重命名为 ignores_table_name_case 以更准确地反映其使用方式。
  • name 关键字参数被添加到 DatabaseWrapper.create_cursor(self, name=None) 方法中,以允许在支持它的后端上使用服务器端游标。


不再支持 PostgreSQL 9.2 和 PostGIS 2.0

对 PostgreSQL 9.2 的上游支持将于 2017 年 9 月结束。 因此,Django 1.11 将 PostgreSQL 9.3 设置为它正式支持的最低版本。

对 PostGIS 2.0 的支持也被删除,因为 PostgreSQL 9.2 是支持它的最后一个版本。

此外,psycopg2 的最低支持版本从 2.4.5 增加到 2.5.4。


LiveServerTestCase 绑定到端口 0

LiveServerTestCase 绑定到端口 0 并依赖操作系统分配一个空闲端口,而不是获取端口范围并迭代以找到一个空闲端口。 DJANGO_LIVE_TEST_SERVER_ADDRESS 环境变量不再使用,由于它也不再使用,所以删除了 manage.py test --liveserver 选项。

如果需要将 LiveServerTestCase 绑定到特定端口,请使用 Django 1.11.2 中添加的 port 属性。


防止 django.contrib.auth 和 i18n 视图中的不安全重定向

LoginViewLogoutView(以及已弃用的基于函数的等价物)和 set_language() 保护用户在以下情况下不会被重定向到非 HTTPS next URL该应用程序通过 HTTPS 运行。


QuerySet.get_or_create() 和 update_or_create() 验证参数

为了防止输入错误,get_or_create()update_or_create() 检查它们的参数是否是模型字段。 这应该是向后不兼容的,因为它可能会暴露您的项目中的错误。


pytz 是必需的依赖项,并删除了对 settings.TIME_ZONE = None 的支持

为了简化 Django 的时区处理,pytz 现在是必需的依赖项。 它与 Django 一起自动安装。

删除了对 settings.TIME_ZONE = None 的支持,因为该行为不常用且有用。 如果想根据系统时区自动检测时区,可以使用tzlocal

from tzlocal import get_localzone

TIME_ZONE = get_localzone().zone

这与 settings.TIME_ZONE = None 的工作原理类似,除了它还设置 os.environ['TZ']如果您发现无法调整代码以设置 TIME_ZONE,请告诉我们


管理模板中的 HTML 更改

<p class="help"> 被替换为 <div> 标签以允许在帮助文本中包含列表。

只读字段包含在 <div class="readonly">...</div> 而不是 <p>...</p> 中,以允许任何类型的 HTML 作为字段的内容。


由于引入基于模板的小部件呈现而发生的变化

django.forms.widgets 中一些未记录的类被删除:

  • SubWidget
  • RendererMixinChoiceFieldRendererRadioFieldRendererCheckboxFieldRenderer
  • ChoiceInputRadioChoiceInputCheckboxChoiceInput

未记录的 Select.render_option() 方法被删除。

Widget.format_output() 方法被删除。 请改用自定义小部件模板。

某些小部件值,例如 <select> 选项,现在已本地化为 settings.USE_L10N=True。 您可以使用使用 :ttag:`localize` 模板标签关闭本地化的自定义小部件模板恢复到旧行为。


django.template.backends.django.Template.render() 禁止非字典上下文

为了与多个模板引擎兼容,django.template.backends.django.Template.render()(从 loader.get_template() 等高级模板加载器 API 返回)必须接收上下文字典而不是 Context 或 [ X192X]。 如果您要传递两个类中的任何一个,请改为传递字典 - 这样做与旧版本的 Django 向后兼容。


迁移操作中的模型状态变化

为了提高应用迁移的速度,相关模型的渲染会延迟到需要它们的操作(例如 RunPython)。 如果您有一个自定义操作适用于 database_forwards()database_backwards() 中的 from_state 参数中的模型类或模型实例,您必须使用 clear_delayed_apps_cache() 渲染模型状态] 方法,如 编写您自己的迁移操作 中所述。


PostgreSQL 上的服务器端游标

使 QuerySet.iterator() 在 PostgreSQL 上使用服务器端游标的更改阻止在事务池模式下使用 pgBouncer 运行 Django。 要实现这一点,请使用 :设置:`DISABLE_SERVER_SIDE_CURSORS ` 设置(在 Django 1.11.1 中添加)在 :设置:`数据库` .

有关更多讨论,请参阅 事务池和服务器端游标


杂项

  • 如果提要中没有项目具有 pubdateupdateddate 属性,SyndicationFeed.latest_post_date() 现在返回当前的 UTC 日期/时间,而不是没有任何时区的日期时间信息。

  • CSRF 失败记录到 django.security.csrf 记录器而不是 django.request

  • :setting:`ALLOWED_HOSTS` 运行测试时不再禁用验证。 如果您的应用程序包含带有自定义主机名的测试,您必须在 :setting:`ALLOWED_HOSTS` 中包含这些主机名。 请参阅 测试和多个主机名

  • 使用外键的 id(例如 ModelAdmin.list_display 中的 'field_id') 显示相关对象的 ID。 如果您想要对象的字符串表示的旧行为,请删除 _id 后缀。

  • 在模型形式中,CharFieldnull=True 现在为空值而不是空字符串保存 NULL

  • 在 Oracle 上,Model.validate_unique() 不再检查空字符串的唯一性,因为数据库将值解释为 NULL

  • 如果您子类化 AbstractUser 并覆盖 clean(),请确保它调用 super()BaseUserManager.normalize_email() 在新的 AbstractUser.clean() 方法中被调用,以便在模型表单验证等情况下应用规范化。

  • EmailFieldURLField 不再接受 strip 关键字参数。 删除它是因为它在旧版本的 Django 中没有影响,因为这些字段总是去除空格。

  • 表单小部件呈现的 checkedselected 属性现在使用 HTML5 布尔语法,而不是 XHTML 的 checked='checked'selected='selected'

  • RelatedManager.add()remove()clear()set() 现在清除 prefetch_related() ] 缓存。

  • 为了防止可能丢失已保存的设置,setup_test_environment() 现在在调用 teardown_test_environment() 之前第二次调用时会引发异常。

  • 删除了 DjangoJSONEncoder(在 Django 1.0 中重命名)的未记录的 DateTimeAwareJSONEncoder 别名。

  • 缓存模板加载器现在启用如果 :设置:`选项['装载机'] ` 未指定并且 :设置:`选项['调试'] `False (后一个选项默认为 :设置:`调试` )。 如果您有一些 模板标签不是线程安全的 ,这可能是向后不兼容的。

  • 运行migrate命令后不再出现陈旧内容类型删除提示。 改用新的 :djadmin:`remove_stale_contenttypes` 命令。

  • IntegerField 的管理员小部件使用 type="number" 而不是 type="text"

  • 现在根据 RFC 7232 条件请求规范而不是旧的 RFC 2616 来解析和比较条件 HTTP 标头。

  • patch_response_headers() 不再添加 Last-Modified 标头。 根据 RFC 7234#section-4.2.2,这个头与提供明确过期时间的其他缓存头一起是无用的,例如 ExpiresCache-ControlUpdateCacheMiddlewareadd_never_cache_headers() 调用 patch_response_headers(),因此也受此更改的影响。

  • 在管理模板中,<p class="help"> 被替换为 <div> 标签,以允许在帮助文本中包含列表。

  • ConditionalGetMiddleware 不再设置 Date 标头,因为 Web 服务器设置了该标头。 它也不再设置 Content-Length 标头,因为这现在由 CommonMiddleware 完成。

    如果您有修改响应内容的中间件并出现在 MIDDLEWAREMIDDLEWARE_CLASSES 设置中的 CommonMiddleware 之前,则必须重新排序中间件,以便在 [ X202X] 已设置,或让响应修改中间件重置 Content-Length 标头。

  • get_model()get_models() 现在提高 AppRegistryNotReady 如果它们在所有应用程序的模型加载之前被调用。 以前他们只需要加载目标应用程序的模型,因此可以在没有建立所有关系的情况下返回模型。 如果您需要 get_model() 的旧行为,请将 require_ready 参数设置为 False

  • 未使用的 BaseCommand.can_import_settings 属性被删除。

  • 未记录的 django.utils.functional.lazy_property 被删除。

  • 为了与非多部分请求保持一致,MultiPartParser.parse() 现在让 request.POST 保持不变。 如果您正在修改 QueryDict,您现在必须先复制它,例如 request.POST.copy()

  • 支持cx_Oracle < 5.2 被删除。

  • 对 IPython < 1.0 的支持已从shell命令。

  • 私有API签名Widget.build_attrs()extra_attrs=None, **kwargs变更为base_attrs, extra_attrs=None

  • 使用测试客户端上传到 ImageField 的类文件对象(例如,StringIOBytesIO)现在需要 name 属性的值通过validate_image_file_extension 验证器。 请参阅 Client.post() 中的注释。

  • FileField 现在移动而不是复制它收到的文件。 使用默认文件上传设置,大于 :setting:`FILE_UPLOAD_MAX_MEMORY_SIZE` 的文件现在具有与临时文件相同的权限(通常是 0o600),而不是系统的标准 umask(通常是 0o6644)。 如果无论文件大小如何都需要相同的权限,请设置 :setting:`FILE_UPLOAD_PERMISSIONS`


在 1.11 中被废弃的功能

杂项

  • contrib.authlogin()logout() 基于函数的视图被弃用,取而代之的是新的基于类的视图 LoginViewLogoutView .
  • 不推荐使用 contrib.auth.views.logout_then_login() 的未使用的 extra_context 参数。
  • contrib.authpassword_change()password_change_done()password_reset()password_reset_done()password_reset_confirm()password_reset_complete()不推荐使用基于函数的视图,取而代之的是新的基于类的视图 PasswordChangeViewPasswordChangeDoneViewPasswordResetView、PasswordResetDoneView[X26277X5X] 和 PasswordResetCompleteView
  • django.test.runner.setup_databases() 移至 django.test.utils.setup_databases()。 旧位置已弃用。
  • django.utils.translation.string_concat() 已弃用 django.utils.text.format_lazy()string_concat(*strings) 可以替换为 format_lazy('{}' * len(strings), *strings)
  • 对于 PyLibMCCache 缓存后端,不推荐将 pylibmc 行为设置作为 OPTIONS 的顶级属性传递。 将它们设置在 OPTIONS 内的 behaviors 键下。
  • django.utils.http.is_safe_url()host 参数已弃用,取而代之的是新的 allowed_hosts 参数。
  • 渲染时引发的静默异常 :ttag:`{% 包含 %} ` 模板标签已被弃用,因为该行为通常比帮助更令人困惑。 在 Django 2.1 中,将引发异常。
  • DatabaseIntrospection.get_indexes() 已弃用,取而代之的是 DatabaseIntrospection.get_constraints()
  • authenticate() 现在将 request 参数传递给身份验证后端的 authenticate() 方法。 对不接受 request 作为第一个位置参数的方法的支持将在 Django 2.1 中删除。
  • USE_ETAGS 设置已弃用,取而代之的是 ConditionalGetMiddleware,它现在将 ETag 标头添加到响应中,而不管设置如何。 当弃用结束时,CommonMiddlewaredjango.utils.cache.patch_response_headers() 将不再设置 ETag。
  • Model._meta.has_auto_field 已弃用,以支持检查 Model._meta.auto_field is not None
  • 不推荐在 url() 中使用带有 iLmsu# 的正则表达式组。 唯一有用的组是 (?i) 用于不区分大小写的 URL,但是,不区分大小写的 URL 不是一个好的做法,因为它们会为搜索引擎创建多个条目,例如。 另一种解决方案可能是创建一个 handler404,它会在 URL 中查找大写字符并重定向到等效的小写字符。
  • renderer 参数被添加到 Widget.render() 方法中。 不接受该参数的方法将在弃用期期间起作用。