Django 3.1 于2020年8月4日发布,支持Python 3.6、3.7、3.8或更高版本。
从3.1开始,Django支持请求过程的全异步,包括:
要编写一个异步视图很简单,只需要用async
关键字:
import datetime from django.http import HttpResponse async def current_datetime(request): now = datetime.datetime.now() html = '<html><body>It is now %s. from https://www.liujiangblog.com</body></html>' % now return HttpResponse(html)
或者如下面的例子:
async def my_view(request): await asyncio.sleep(0.5) return HttpResponse('Hello, async world!')
注意:
异步功能同时支持WSGI和ASGI模式
在WSGI模式下,使用异步功能会有性能损失
Django3.1新增了models.JSONField
和forms.JSONField
两种字段类型,也就是字面上的JSON数据类型,可用于所有支持的数据库后端,并且可以自定义编码器和解码器。
class ContactInfo(models.Model): data = models.JSONField() # ORM的API范例 ContactInfo.objects.create(data={ 'name': 'John', 'cities': ['London', 'Cambridge'], 'pets': {'dogs': ['Rufus', 'Meg']}, }) ContactInfo.objects.filter( data__name='John', data__pets__has_key='dogs', data__cities__contains='London', ).delete()
这个字段类型支持一些先前只有PostgresSQL支持的高级查询用法,如上例所示。
first_name
长度增加auth框架中AbstractUser
模型的first_name
字段最大长度增至150。Django为此特别增加了一个迁移文件。
如果你现有的项目中继承了这个模型,那么当你从旧的Django版本升级到3.1,你需要手动生成迁移文件并执行迁移操作。
如果你依然想保持长度为30的限制,可以自定义表单。
首先继承原有表单,并重写first_name
字段。
from django import forms from django.contrib.auth.forms import UserChangeForm class MyUserChangeForm(UserChangeForm): first_name = forms.CharField(max_length=30, required=False)
在需要输入first_name
的页面处使用MyUserChangeForm
,比如admin的页面:
from django.contrib.auth.admin import UserAdmin from django.contrib.auth.models import User class MyUserAdmin(UserAdmin): form = MyUserChangeForm admin.site.unregister(User) admin.site.register(User, MyUserAdmin)
PASSWORD_RESET_TIMEOUT
配置项,用于自定义密码重置链接的生存周期秒数,用以替代即将在Django4.0中废弃的PASSWORD_RESET_TIMEOUT_DAYS
配置项。django.contrib.humanize
人性化中的intword
模板过滤器现在支持负整数STATICFILES_DIRS
和EMAIL_FILE_PATH
配置项现在支持pathlib.Path
库django.forms.DateTimeField
现在支持新的时间格式,例如 2019-10-10T06:47
、2019-10-10T06:47:23+04:00
或者2019-10-10T06:47:23Z
ALLOW_HOSTS
列表为空并且DEBUG=True
,那么localhost
的子域名可用,例如static.localhost
include
模板标签现在可以迭代模板名