django-url路由系统
530字约2分钟
2024-09-29
URL路由系统是什么
简而言之,路由系统就是URL路径和视图函数的一个对应关系,也可以称为转发器。
URL配置
URL路由系统格式:
# devops/urls.py
urlpatterns = [
    path(regex, view, kwargs=None, name=None)
]urlpatterns:一个列表,每一个path()函数是一个元素,对应一个视图
参数:
- regex:一个字符串或者正则表达式,匹配URL 
- view:对应一个函数视图或者类视图(as_view()的结果),必须返回一个HttpResponse对象,Django将这个 对象转换成一个HTTP响应 
- kwargs:可选,字典形式数据传递给对应视图 
- name:可选,URL名称 
URL路由分发

URL路由分发好处:urls配置解耦,方便管理
示例:
# devops/urls.py
from myapp import views as myapp_views
urlpatterns = [ 
    path('index', views.index), 
    path('myapp/', include('myapp_views.urls')), 
]
# myapp/urls.py
urlpatterns = [
    path("hello", views.hello)
]访问地址:http://127.0.0.1:8000/myapp/hello
URL正则表达式匹配
URL路径也可以使用正则表达式匹配,re_path()替代path()
示例:博客文章归档访问形式
from django.urls import re_path 
from devops import views
urlpatterns = [ 
    re_path('articles/2020/$', views.specified_2020), 
    re_path('^articles/([0-9]{4})/$', views.year_archive), 
    re_path('^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive), 
    re_path('^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]视图:
def specified_2020(request): 
    return HttpResponse("指定2020年 文章列表")
def year_archive(request, year):
    return HttpResponse("%s年 文章列表" % year)
def month_archive(request, year, month):
    return HttpResponse("%s年/%s月 文章列表" % (year, month))
def article_detail(request, year, month, id):
    return HttpResponse("%s年/%s月 文章ID: %s" %(year, month, id))命名分组语法:(?P<name>pattern) 其中name是名称,pattern是匹配的正则表达式示例:博客文章归档访问形式
from django.urls import re_path 
from devops import views
urlpatterns = [ 
    re_path('articles/2020/$', views.specified_2020), 
    re_path('^articles/(?P<year>[0-9]{4})/$', views.year_archive),
    re_path('^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
    re_path('^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<id>[0-9]+)/$', views.article_detail),
]URL名称
在前端代码里经常会指定URL,例如超链接,提交表单等,这时用URL反查就方便多了。
之前:
<a href="/hello">您好</a>
之后:
<a href="{% url 'hello' %}">您好</a>