新项目,新技术,关于django2.x path路由用法总结。
在Django2.0其中一个新特性为:简化Url路由的语法。
在代码上主要体现在新增了django.urls.path函数,它带来了更简洁、更可读的路由语法,如:
原来的url:
url(r'^articles/(?P[0-9]{4})/$', views.year_archive),
Django2.0新语法:
path('articles//', views.year_archive),
新语法支持url参数的类型转化。例子里的year_archive函数接收到的year参数作为参数,并且会自动转换year为整型而不是字符串。
在Django1.x里,我们需要对year做类型转换:
def year_archive(request, year):
year = int(year)
在新的语法里,url字符串有以下规则:
代码示例:
from django.urls import path
from . import views
urlpatterns = [
path('articles/2003/', views.special_case_2003),
path('articles//', views.year_archive),
path('articles///', views.month_archive),
path('articles////', views.article_detail),
]
匹配示例
url里捕获的值使用Path Converter来对值做转换,如类型转换。Django2.0自带了默人的Path Converter,同时也支持自定义Path Conveter。
Django2.0自带的PathConveter包括:
例子: path('image_codes/
定义Converter类需要包含下面的属性或方法:
定义Path Converter
class FourDigitYearConverter:
regex = '[0-9]{4}'
def to_python(self, value):
return int(value)
def to_url(self, value):
return '%04d' % value
使用register_converter()注册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//', views.year_archive),
...
]
Django2.0也支持我们使用正则表达式来捕获值。注意,用正则表达式捕获值,需要使用re_path(),而不是前面介绍的path()。
正则表达式建议使用命名正则表达式组,语法如下:
(?Ppattern)
其中,尖括号里的name为分组名,pattern为正则表达式。
前面的示例可以使用正则表达式修改为:
from django.urls import path, re_path
from . import views
urlpatterns = [
path('articles/2003/', views.special_case_2003),
re_path('articles/(?P[0-9]{4})/', views.year_archive),
re_path('articles/(?P[0-9]{4})/(?P[0-9]{2})/', views.month_archive),
re_path('articles/(?P[0-9]{4})/(?P[0-9]{2})/(?P[\w-_]+)/', views.article_detail),
]
与前面的示例不同点:
在path里支持对view设置默认值。
from django.urls import path
from . import views
urlpatterns = [
path('blog/', views.page),
path('blog/page/', views.page),
]
# View (in blog/views.py)
def page(request, num=1):
# Output the appropriate page of blog entries, according to num.
...
page函数num的默认值设置为1.