该模块是django的url路由模块,url路由是django程序的入口,用户发出一个请求,该请求匹配url列表,通过url来定位视图,视图处理请求,并做出响应。
- init.py : django 路由模块初始化文件。
- base.py : django路由基类,我们常用的
reverse
、resolve
函数都在该模块。 - conf.py : django路由模块配置类,
include
、path
、re_path
函数都在这个模块。 - converters.py :django路由转换器,对url参数的转换,例如:int类型、字符串string类型。
- exceptions.py :django路由模块异常类。
- resolvers.py :django路由模块url解析类。
- utils.py :django路由模块工具类。
django路由实例
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:slug>/', views.article_detail),
]
路径转换器
默认情况下,以下路径转换器可用:
- str- 匹配除路径分隔符之外的任何非空字符串'/'。如果转换器未包含在表达式中,则这是默认值。
- int - 匹配零或任何正整数。返回一个int。
- slug - 匹配由ASCII字母或数字组成的任何slug字符串,以及连字符和下划线字符。例如, building-your-1st-django-site。
- uuid - 匹配格式化的UUID。要防止多个URL映射到同一页面,必须包含短划线并且字母必须为小写。例如,075194d3-6885-417e-a8a8-6c931e272f00。返回一个 UUID实例。
- path- 匹配任何非空字符串,包括路径分隔符 '/'。这使您可以匹配完整的URL路径,而不仅仅是URL路径的一部分str。
使用正则表达式
如果路径和转换器语法不足以定义URL模式,则还可以使用正则表达式。为此,请使用 re_path()
而不是path()
。
在Python正则表达式中,命名正则表达式组的语法是(?P<name>pattern)
,组name的名称,并且 pattern是要匹配的模式。
这是前面的示例URLconf,使用正则表达式重写:
from django.urls import path, re_path
from . import views
urlpatterns = [
path('articles/2003/', views.special_case_2003),
re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[\w-]+)/$', views.article_detail),
]
包括其他的URLconf
from django.urls import include, path
urlpatterns = [
# ... snip ...
path('community/', include('aggregator.urls')),
path('contact/', include('contact.urls')),
# ... snip ...
]
URL的反向解析
from django.urls import path
from . import views
urlpatterns = [
#...
path('articles/<int:year>/', views.year_archive, name='news-year-archive'),
#...
]
<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>
{# Or with the year in a template context variable: #}
<ul>
{% for yearvar in year_list %}
<li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li>
{% endfor %}
</ul>
更多Django教程
学习更多Django教程