Django 1.11发行说明

2017年4月4日

欢迎来到Django 1.11!

这些发行说明涵盖了从Django 1.10或更旧版本升级时,您将需要注意new features,以及一些backwards incompatible changes We’ve begun the deprecation process for some features.

如果要更新现有项目,请参阅Upgrading Django to a newer version指南。

Django 1.11被指定为long-term support release 它将在发布后至少三年内收到安全更新。 支持以前的LTS,Django 1.8将于2018年4月结束。

Python兼容性

Django 1.11需要Python 2.7,3.4,3.5或3.6。 Django 1.11是第一个支持Python 3.6的版本。 我们强烈推荐,只有正式支持每个系列的最新版本。

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之后,我们建议第三方应用程序作者在1.11之前删除对所有版本的Django的支持。 那时候你应该可以使用python -Wd来运行你的软件包的测试,这样就会出现弃用警告。 在进行了弃用警告修复后,您的应用程序应与Django 2.0兼容。

Django 1.11 中的新功能

基于类的模型索引

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

The Index class creates a b-tree index, as if you used db_index on the model field or index_together on the model Meta class. 它可以被子类化以支持不同的索引类型,例如GinIndex 它还允许为索引的列定义顺序(ASC / DESC)。

基于模板的窗口小部件呈现

为了简化自定义窗口小部件,窗体小部件呈现现在使用模板系统而不是Python。 请参阅The form rendering API

您可能需要调整您为几个backwards incompatible changes

Subquery表达式

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

次要功能

django.contrib.admin

django.contrib.auth

  • PBKDF2密码缓存器的默认迭代计数增加了20%。
  • 基于类视图的LoginViewLogoutView视图取代了基于功能的视图的不推荐使用的login()logout()
  • PasswordChangeViewPasswordChangeDoneViewPasswordResetViewPasswordResetDoneViewPasswordResetConfirmViewPasswordResetCompleteView基于类的视图取代了不推荐的password_change()password_change_done()password_reset()password_reset_done()password_reset_confirm()password_reset_complete()基于功能的视图。
  • The new post_reset_login attribute for PasswordResetConfirmView allows automatically logging in a user after a successful password reset. 如果您配置了多个AUTHENTICATION_BACKENDS,请使用post_reset_login_backend属性来选择要使用的属性。
  • 为了避免通过HTTP Referer标题泄漏密码重置令牌的可能性(例如,如果重置页面包含对另一个域上托管的CSS或JavaScript的引用),则PasswordResetConfirmView(但不是已弃用) password_reset_confirm()基于功能的视图)将令牌存储在会话中,并重定向到自身以向用户显示密码更改表单,而不在URL中使用令牌。
  • update_session_auth_hash()现在旋转会话密钥以允许密码更改以使被盗会话cookie无效。
  • LoginViewLogoutView的新success_url_allowed_hosts属性允许指定一组在登录和注销后重定向的主机。
  • 添加密码验证器help_textUserCreationForm
  • HttpRequest现在被传递给authenticate(),如果它接受request参数,则继承它到认证后端。
  • user_login_failed()信号现在接收到一个request参数。
  • PasswordResetForm supports custom user models that use an email field named something other than 'email'. CustomUser.EMAIL_FIELD设置为字段的名称。
  • 即使在定义模型的模块中,现在可以在导入时调用get_user_model()

django.contrib.contenttypes

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

django.contrib.gis

  • 新的GEOSGeometry.from_gml()OGRGeometry.from_gml()方法允许从GML创建几何。
  • 增加了对SpatiaLite的dwithin查询的支持。
  • The Area function, Distance function, and distance lookups now work with geodetic coordinates on SpatiaLite.
  • 现在基于OpenLayers的窗体小部件使用比https://cdnjs.cloudflare.com中的OpenLayers.js更适合于生产使用而不是旧的http://openlayers.org来源。 它们也被更新为使用OpenLayers 3。
  • PostGIS迁移现在可以更改字段维。
  • 增加了在创建GDALRaster对象时传递sizeshapeoffset参数的功能。
  • 添加了对IsValid函数,MakeValid函数和isvalid查找的SpatiaLite支持。
  • 增加了对AsGML函数,BoundingCircle函数IsValid函数和isvalid查询的Oracle支持。

django.contrib.postgres

高速缓存¶ T0>

  • Memcached后端现在将OPTIONS的内容作为关键字参数传递给客户端构造函数,从而允许对客户端行为进行更高级的控制。 有关示例,请参阅cache arguments文档。
  • Memcached后端现在允许在LOCATION中将多个服务器定义为逗号分隔的字符串,以方便在环境变量中使用这样的字符串的第三方服务。

CSRF ¶ T0>

  • 添加了CSRF_USE_SESSIONS设置,以便将CSRF令牌存储在用户的会话中,而不是在cookie中。

数据库后端

  • 在PostgreSQL 9.5+和Oracle上添加skip_locked参数到QuerySet.select_for_update(),以执行FOR UPDATE SKIP LOCKED
  • 添加了TEST['TEMPLATE']设置,让PostgreSQL用户指定一个用于创建测试数据库的模板。
  • QuerySet.iterator()现在在PostgreSQL上使用server-side cursors 此功能将一些工作内存负载(用于保存查询结果)传输到数据库,并可能增加数据库内存使用量。
  • OPTIONS中的'isolation_level'选项添加了MySQL支持,以允许指定transaction isolation level 为了避免可能的数据丢失,建议从MySQL的默认级别切换到可重读的读取。
  • 增加了对cx_Oracle 5.3的支持。

电子邮件¶ T0>

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

文件存储

  • 为了使它可以被io.TextIOWrapper包装,File现在有readable()writable()seekable()方法。

表格¶ T0>

国际¶ T0>

  • 数字格式设置和NUMBER_GROUPING设置支持不一致的数字分组。

管理命令

迁移¶ T0>

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

模型¶ T0>

请求和回复

序列化¶ T0>

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

模板¶ T0>

  • mark_safe()现在可以用作装饰器。
  • Jinja2模板后端现在通过在OPTIONS中设置'context_processors'选项来支持上下文处理器。
  • The regroup tag now returns namedtuples instead of dictionaries so you can unpack the group object directly in a loop, e.g. {% for grouper, list in regrouped %}.
  • 添加了一个resetcycle模板标签,以允许复位cycle模板标签的顺序。
  • 您现在可以为特定的filesystem.Loader指定特定目录。

测试¶ T0>

验证¶ T0>

向下不兼容的变化1.11

django.contrib.gis

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

django.contrib.staticfiles

  • collectstatic may now fail during post-processing when using a hashed static files storage if a reference loop exists (e.g. 'foo.css' references 'bar.css' which itself references 'foo.css') or if the chain of files referencing other files is too deep to resolve in several passes. 在后一种情况下,使用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()方法来支持time查找。 它接受field_nametzname参数,并返回将datetime值转换为时间值所需的SQL。
  • 要启用FOR 更新 SKIP LOCKED支持,设置 = True
  • 新的DatabaseFeatures.supports_index_column_ordering属性指定数据库是否允许为索引中的列定义排序。 默认值为True,并且DatabaseIntrospection.get_constraints()方法应在每个返回的字典中包含一个'orders'键,并带有列表的'ASC'和/或'DESC'值对应于索引中每列的顺序。
  • 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绑定到端口零

而不是采用端口范围并迭代找到一个空闲端口,LiveServerTestCase绑定到端口0,并且依靠操作系统分配一个空闲端口。 DJANGO_LIVE_TEST_SERVER_ADDRESS环境变量不再使用,并且由于它也不再使用,manage.py 测试 -liveserver选项被删除。

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

django.contrib.authi18n视图中保护不安全的重定向

LoginViewLogoutView(以及不推荐使用的基于功能的等效项)和set_language()保护用户不被重定向到非HTTPS next URL。

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

为了防止打字错误地传递,get_or_create()update_or_create()检查他们的参数是模型字段。 这应该是向后不兼容的事实,它可能会暴露在您的项目中的错误。

pytz设置的必需依赖关系和支持.TIME_ZONE = 已删除¶ T6>

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

支持settings.TIME_ZONE = 没有被删除,因为行为不常用,并且是有用的。 如果要根据系统时区自动检测时区,可以使用tzlocal

from tzlocal import get_localzone

TIME_ZONE = get_localzone().zone

这与settings.TIME_ZONE = 类似,除了它也设置os.environ['TZ'] 如果有一个用例,您发现无法调整代码以设置TIME_ZONE,请告诉我们

管理模板中的HTML变更

<p class="help"> is replaced with a <div> tag to allow including lists inside help text.

只读字段包裹在&lt; div class =“readonly”&gt; ...&lt; / div&gt;而不是<p>...</p>以允许任何类型的HTML作为字段的内容。

由于引入了基于模板的小部件呈现而导致的更改

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

  • SubWidget的
  • RendererMixinChoiceFieldRendererRadioFieldRendererCheckboxFieldRenderer
  • ChoiceInputRadioChoiceInputCheckboxChoiceInput

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

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

如果settings.USE_L10N=True,某些小部件值(例如<select>选项)现在已被本地化。 您可以通过使用localize模板标签的自定义窗口小部件模板来关闭本地化。

django.template.backends.django.Template.render()禁止非dict语境

为了与多个模板引擎兼容,django.template.backends.django.Template.render()(从高级模板加载器API返回,如loader.get_template() )必须接收上下文字典而不是ContextRequestContext 如果你通过了两个类之一,通过一个字典代替 - 这样做是与旧版本的Django向后兼容的。

迁移操作中的模型状态更改

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

其它¶ T0>

  • 如果Feed中没有项目具有pubdateupdateddate属性,则SyndicationFeed.latest_post_date()现在返回当前UTC日期/时间,而不是没有任何时区信息的datetime。
  • CSRF失败记录到django.security.csrf记录器,而不是django.request
  • 运行测试时,不再禁用ALLOWED_HOSTS验证。 如果您的应用程序包含自定义主机名的测试,则必须在ALLOWED_HOSTS中包含这些主机名。 请参阅Tests and multiple host names
  • ModelAdmin.list_display中使用外键的id(例如'field_id')显示相关对象的ID。 如果您想要对象的字符串表示形式的旧行为,请删除_id后缀。
  • 在模型形式中,CharFieldnull=True现在将NULL保存为空值而不是空字符串。
  • 在Oracle上,当数据库将该值解释为NULL时,Model.validate_unique()不再检查空字符串的唯一性。
  • 如果你继承AbstractUser并覆盖clean(),请确保它调用了super() BaseUserManager.normalize_email()在新的AbstractUser.clean()方法中调用,以便在模型窗体验证的情况下应用规范化。
  • EmailFieldURLField不再接受strip关键字参数。 删除它,因为它在旧版本的Django中没有任何效果,因为这些字段总是删除空格。
  • The checked and selected attribute rendered by form widgets now uses HTML5 boolean syntax rather than XHTML’s checked='checked' and selected='selected'.
  • RelatedManager.add(), remove(), clear(), and set() now clear the prefetch_related() cache.
  • 为了防止可能丢失保存的设置,如果在调用teardown_test_environment()之前再次调用setup_test_environment(),则会引发异常。
  • 删除了DjangoJSONEncoder(在Django 1.0中重命名)的未记录的DateTimeAwareJSONEncoder别名。
  • The cached template loader is now enabled if DEBUG is False and OPTIONS['loaders'] isn’t specified. 如果您有一些不线程安全的template tags that aren’t thread safe,则可能会向后不兼容。
  • 在运行migrate命令后,不再发生陈旧内容类型删除的提示。 改用新的remove_stale_contenttypes命令。
  • 管理员的IntegerField小部件使用type="number"而不是type="text"
  • 条件HTTP标头现在根据 RFC 7232条件请求规范而不是较旧的 RFC 2616进行解析和比较。 。
  • patch_response_headers()不再添加Last-Modified标题。 根据 RFC 7234#section-4.2.2,该标题与提供明确过期时间的其他缓存头一起是无用的,例如 ExpiresCache-Control UpdateCacheMiddlewareadd_never_cache_headers()调用patch_response_headers(),因此也受此更改的影响。
  • In the admin templates, <p class="help"> is replaced with a <div> tag to allow including lists inside help text.
  • ConditionalGetMiddleware不再设置Date头。 它也不再设置Content-Length头,因为现在由CommonMiddleware完成。
  • get_model() and get_models() now raise AppRegistryNotReady if they’re called before models of all applications have been loaded. 以前,他们只需要加载目标应用程序的模型,从而可以返回模型,而不必设置所有的关系。 如果您需要旧的行为get_model(),请将require_ready参数设置为False
  • 未使用的BaseCommand.can_import_settings属性被删除。
  • 未记录的django.utils.functional.lazy_property被删除。
  • 为了与非多部分请求保持一致,MultiPartParser.parse()现在离开request.POST不可变。 如果您要修改QueryDict,则必须首先将其复制,例如request.POST.copy()
  • 支持cx_Oracle
  • shell命令中删除对IPython
  • 私人API Widget.build_attrs()的签名从extra_attrs = None, ** kwargs更改为 base_attrs, extra_attrs = None
  • File-like objects (e.g., StringIO and BytesIO) uploaded to an ImageField using the test client now require a name attribute with a value that passes the validate_image_file_extension validator. 请参阅Client.post()中的注释。

在1.11 中不推荐使用的功能

其它¶ T0>

  • contrib.authlogin()logout()不支持基于功能的视图,有利于新的基于类的视图LoginViewLogoutView
  • 不再使用contrib.auth.views.logout_then_login()的未使用的extra_context参数。
  • contrib.auth’s password_change(), password_change_done(), password_reset(), password_reset_done(), password_reset_confirm(), and password_reset_complete() function-based views are deprecated in favor of new class-based views PasswordChangeView, PasswordChangeDoneView, PasswordResetView, PasswordResetDoneView, PasswordResetConfirmView, and 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) t5> * strings)
  • 对于PyLibMCCache缓存后端,将pylibmc行为设置作为OPTIONS的顶级属性不推荐使用。 将它们设置在OPTIONS内的behaviors键下。
  • django.utils.http.is_safe_url()host参数不利于新的allowed_hosts参数。
  • 渲染{% include %}模板标记的沉默异常已被弃用,因为行为往往更令人困惑比有帮助 在Django 2.1中,将会提出异常。
  • DatabaseIntrospection.get_indexes()不利于DatabaseIntrospection.get_constraints()
  • authenticate()现在将request参数传递给认证后端的authenticate()方法。 支持不接受request作为第一个位置参数的方法将在Django 2.1中被删除。
  • USE_ETAGS设置不利于ConditionalGetMiddleware,现在将ETag头添加到响应中,无论设置如何。 CommonMiddleware and django.utils.cache.patch_response_headers() will no longer set ETags when the deprecation ends.
  • Model._meta.has_auto_field不利于检查Model._meta.auto_field 是否 无 T6> T2>。
  • url()中使用iLmsu#的正则表达式组已被弃用。 对于不区分大小写的URL,唯一有用的组是(?i),例如,不区分大小写的URL不是一个很好的做法,因为它们为搜索引擎创建了多个条目。 一个替代解决方案可能是创建一个handler404,它在URL中查找大写字符,并重定向到小写字母。
  • renderer参数添加到Widget.render()方法中。 不接受该参数的方法将通过弃用期工作。