外观
Django支持的路由形式
Django支持的路由形式有3种。
- 精确字符串形式。即一个精确URL匹配一个操作函数。这是最简单的方式,适合对静态URL的响应。URL字符串不以“/”开头,但要以“/”结尾。如:
path('admin/', admin.site.urls),
path('articles', views.article_list)- 路径转换器形式。在匹配URL格式时,通过URL进行参数获取和传递,语法格式如下:
<类型: 变量名>, articles/<int:year>/例如:
path('articles/<int:year>', views.year_archive),
path('articles/<int:year>/<int:month>', views.month_archive),
path('articles/<int:year>/<int:month>/<slug:slug>', views.article_details)下表中展示了一些常用的格式转换类型。
| 格式类型 | 说明 |
|---|---|
| str | 匹配除分隔符以外的非空字符,默认类型<year>等价为<int:year> |
| int | 匹配0和正整数 |
| slug | 匹配字母、数字、横杠、下画线组成的字符串,是str的子集 |
| uuid | 匹配格式化的UUID |
| path | 匹配任何非空字符串,包含路径分隔符 |
下面演示如何创建路由。
首先在blog/urls.py中创建路由,代码如下:
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('articles/', views.article_list),
path('archives/<int:year>/', views.year_archive),
path('archives/<int:year>/<int:month>/', views.month_archive),
path('archives/<int:year>/<int:month>/<slug:slug>/', views.article_details)
]这个代码中引用了同目录下的views.py文件,接下来创建这个文件,代码如下:
from django.http import HttpResponse
def article_list(request):
return HttpResponse('article_list函数')
def year_archive(request, year):
return HttpResponse(f'year_archive函数,year={year}')
def month_archive(request, year, month):
return HttpResponse(f'month_archive函数,year={year},month={month}')
def article_details(request, year, month, slug):
return HttpResponse(f'article_details函数,year={year},month={month},slug={slug}')启动服务,在浏览器中输入127.0.0.1:8000/articles/,结果如下:
article_list函数在浏览器中输入127.0.0.1:8000/archives/2023/,结果如下:
year_archive函数,year=2023在浏览器中输入127.0.0.1:8000/archives/2023/01/,结果如下:
month_archive函数,year=2023,month=1在浏览器中输入127.0.0.1:8000/archives/2023/01/01/,结果如下:
article_details函数,year=2023,month=1,slug=01- 正则表达式形式。若路径和转换器语法不能很好地识别URL模式,则可以通过更加强大的正则表达式匹配对应的URL。使用正则表达式匹配URL时需要使用re_path()而不是path()。
匹配正则表达式组的语法如下:
(?P<name>pattern)其中,name为组名,pattern为正则表达式。
下面用正则表达式重写前面的路由。
from django.urls import path, re_path
from . import views
urlpatterns = [
path('articles/list/', views.article_list),
re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
re_path(r'^articles/(?P<year>[0-9]{4}/<month>[0-9]{1,2})/$', views.month_archive),
re_path(r'^articles/(?P<year>[0-9]{4}/<month>[0-9]{1,2}/<slug>[\w+-_])/$', views.article_details)
]