9月23,Django 发布了2.0a1版本,这是一个 feature freeze 版本,如果没有什么意外的话,2.0正式版不会再增加新的功能了。按照以往的规律,预计正式版将在12月发布。
备注:Django 2.0 于12月2日已经正式发布。 (链接)
2.0无疑是一个里程碑版本,移除了对 Python2.7 的支持,最少需要 3.4 以上,建议使用3.5以上的版本。
What's new in Django2.0 文档中一共列出了三个新的特性:
更简单的URL路由语法 (Simplified URL routing syntax)
admin应用的针对移动设备的优化改进(Mobile-friendly contrib.admin)
支持SQL开窗表达式(Window expressions)
第一个特性,主要用于动态路由定义上。在Django2.0代码实现中,主要的变化是新增了 django.urls.path 函数,它允许使用一种更加简洁、可读的路由语法。比如之前的版本的代码:
url(r'^articles/("htmlcode">path('articles/<int:year>/', views.year_archive),新语法支持类型转化,在上述的例子中, year_archive 函数接收到的year参数就变成整数而不是字符串。
如果你有接触过 Flask 框架,就会发现和 Variable-Rules 的语法形式和功能都是相类似的。
一 问题引入
下面是 Django1.X 的一段代码:
from django.conf.urls import url def year_archive(request, year): year = int(year) # convert str to int # Get articles from database def detail_view(request, article_id): pass def edit_view(request, article_id): pass def delete_view(request, article_id): pass urlpatterns = [ url('articles/("color: #ff0000">二 使用示例这是一个简单的例子:
from django.urls import path from . import views urlpatterns = [ path('articles/2003/', views.special_case_2003), path('articles/<int:year>/', views.year_archive), path('articles/<int:year>/<int:month>/', views.month_archive), path('articles/<int:year>/<int:month>/<slug>/', views.article_detail), ]基本规则:
- 使用尖括号(<>)从url中捕获值。
- 捕获值中可以包含一个转化器类型(converter type),比如使用 <int:name> 捕获一个整数变量。若果没有转化器,将匹配任何字符串,当然也包括了 / 字符。
- 无需添加前导斜杠。
以下是根据 2.0官方文档 而整理的示例分析表:
请求URL 匹配项 视图函数调用形式 /articles/2005/03/ 第3个 views.month_archive(request, year=2005, month=3) /articles/2003/ 第1个 views.special_case_2003(request) /articles/2003 无 - /articles/2003/03/building-a-django-site/ 第4个 views.article_detail(request, year=2003, month=3, slug=”building-a-django-site”)三 path转化器
文档原文是Path converters,暂且翻译为转化器。
Django默认支持以下5个转化器:
- str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
- int,匹配正整数,包含0。
- slug,匹配字母、数字以及横杠、下划线组成的字符串。
- uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
- path,匹配任何非空字符串,包含了路径分隔符
四 自定义转化器
4.1 定义
对于一些复杂或者复用的需要,可以定义自己的转化器。转化器是一个类或接口,它的要求有三点:
- regex 类属性,字符串类型
- to_python(self, value) 方法,value是由类属性 regex 所匹配到的字符串,返回具体的Python变量值,以供Django传递到对应的视图函数中。
- to_url(self, value) 方法,和 to_python 相反,value是一个具体的Python变量值,返回其字符串,通常用于url反向引用。
先看看默认的 IntConverter 和 StringConverter 是怎么实现的:
class IntConverter: regex = '[0-9]+' def to_python(self, value): return int(value) def to_url(self, value): return str(value) class StringConverter: regex = '[^/]+' def to_python(self, value): return value def to_url(self, value): return value第二个例子,是自己实现的4位年份的转化器。
class FourDigitYearConverter: regex = '[0-9]{4}' def to_python(self, value): return int(value) def to_url(self, value): return '%04d' % value4.2 注册
使用register_converter 将其注册到URL配置中:
from django.urls import register_converter, path from . import converters, views register_converter(converters.FourDigitYearConverter, 'yyyy') urlpatterns = [ path('articles/2003/', views.special_case_2003), path('articles/<yyyy:year>/', views.year_archive), ... ]五 使用正则表达式
如果上述的paths和converters还是无法满足需求,也可以使用正则表达式,这时应当使用 django.urls.re_path函数。
在Python正则表达式中,命名式分组语法为 ("htmlcode">
from django.urls import path, re_path from . import views urlpatterns = [ path('articles/2003/', views.special_case_2003), re_path('articles/("color: #ff0000">六 Import变动django.urls.path 可以看成是 django.conf.urls.url 的增强形式。
为了方便,其引用路径也有所变化,请注意下 urls 包路径的变更,不再是 conf 的子包了,目前和 views 、conf 一样,被认为是 Django 的核心组件。
1.X 2.0 备注 - django.urls.path 新增,url的增强版 django.conf.urls.include django.urls.include 路径变更 django.conf.urls.url django.urls.re_path 异名同功能,url不会立即废弃七 代码改写
将“问题引入”一节的代码使用新的path函数可以改写如下:
from django.urls import path, register_converter from django.urls.converters import SlugConverter class FourDigitYearConverter: regex = '[0-9]{4}' def to_python(self, value): return int(value) def to_url(self, value): return '%04d' % value register_converter(SlugConverter, 'article_id') register_converter(FourDigitYearConverter, 'year') def year_archive(request, year): print(type(year)) # <class 'int'> # Get articles from database def detail_view(request, article_id): pass def edit_view(request, article_id): pass def delete_view(request, article_id): pass urlpatterns = [ path('articles/<year:year>/', year_archive), path('article/<article_id:article_id>/detail/', detail_view), path('articles/<article_id:article_id>/edit/', edit_view), path('articles/<article_id:article_id>/delete/', delete_view), ]八 总结
第一,目前 路由(url)到视图(View)的流程可以概括为四个步骤:
1.url匹配
2.正则捕获
3.变量类型转化
4.视图调用Django2.0 和之前相比多了 变量类型转化 这一步骤。
第二,新的path语法可以解决一下以下几个场景:
- 类型自动转化
- 公用正则表达式
了解更多:https://www.jb51.net/article/165591.htm
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
更新日志
- 群星《唱给女人的歌》24K德国HD金碟[WAV+CUE]
- 孙燕姿.2011-是时候【美妙音乐】【WAV+CUE】
- 苏芮.2003-回首·时代全经典2CD【华纳】【WAV+CUE】
- 梁咏琪.1996-爱自己【EEI】【WAV+CUE】
- IGN经典逆天骚操作名著——《墙头草修炼手册》
- 突然爆火的“网红游戏”,真的有那么多人玩吗?
- 何老师客串《浪人崛起》了?盘点与明星撞脸的角色!
- 【原神】关于星鹫赤羽对珐芙琴班配队下珐露珊主C的适配度分析
- 【原神】V5.1攻略 | 迪西雅角色简评
- 【原神】大日御舆顶端怎么上去
- 胥拉齐《感谢有你》DTS-WAV
- 罗海英《金牌歌后》【WAV+CUE】
- 林叶《林叶·夜》【WAV/分轨】
- 群星《国语经典名曲01》音乐磁场系列[WAV+CUE][1G]
- 齐豫《滚石24K》24K金碟珍藏版系列[低速原抓WAV+分轨][1G]