** 其本质是URL与该URL要调用的视图函数之间的映射,就是为告诉Django对客户端发过来的某个URL应该调用执行哪一段逻辑代码**
from django.conf.urls import url
# urlpatterns必须是一个由url()实例组成的Python列表
urlpatterns = [
# url(regex, view, kwargs=None, name=None),
url(正则表达式, 视图函数名, 可选参数, 路由别名),
]
"""
url()函数中的参数解释:
正则表达式:一个正则表达式字符串
views视图函数:一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
参数:可选的要传递给视图函数的默认参数(字典形式)
别名:一个可选的name参数,用于反向解析
"""
细说url函数的第一个参数:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^articles/2003/$', views.special_case_2003),
url(r'^articles/([0-9]{4})/$', views.year_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'^index/$', views.index), # 结尾加'/'
url(r'^test$', views.test), # 结尾不加 '/'
]
例如:
测试1:访问http://127.0.0.1:8000/index或http://127.0.0.1:8000/index/ 结果都是成功的,因为当访问http://127.0.0.1:8000/index时会自动做301重定向到http://127.0.0.1:8000/index/
测试2:访问http://127.0.0.1:8000/test是成功的, http://127.0.0.1:8000/test/就会失败了
如路由中结尾有’/’ 但请求中的url结尾没有加’/'匹配时是否在URL中附加尾部斜杠 True添加,False不添加
APPEND_SLASH=True # Django的global_settings的默认配置
测试1中:http://127.0.0.1:8000/index写法也能访问成功的原因就是APPEND_SLASH默认设置了为True,但是如果把此配置改为False,那么访问 r’^index/$’ 路由时就必须在结尾的加上’/’。
总结:
由此测试可以说明在定义路由时结尾加上 '/ ’ 会让路由更加灵活。
# 将加圆括号的正则表达式匹配到的内容当做位置参数自动传递给对应的视图函数
# 路由层
url(r'^test/(\d+)/',views.test), # 匹配一个或多个数字
# 视图层
def test(request, num): # num接收到从路由括号圆括号内,相应正则表达式中匹配的值
print(num)
return HttpResponse('test')
在Python的正则表达式中,分组命名正则表达式组的语法是(?Ppattern),其中name是组的名称,pattern是要匹配的模式
# 将加圆括号的正则表达式匹配到的内容当做关键字参数自动传递给对应的视图函数
# 路由层
url(r'^test/(?P\d+)/' ,views.test), # 匹配一个或多个数字
# 视图层
def test(request, year): # 此处的形参名一定要和正则组命名一致
print(year)
return HttpResponse('test')
下面是代码是 使用有命名的正则表达式组重写:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^articles/2003/$', views.special_case_2003),
url(r'^articles/(?P[0-9]{4})/$' , views.year_archive),
url(r'^articles/(?P[0-9]{4})/(?P[0-9]{2})/$' , views.month_archive),
url(r'^articles/(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2})/$' , views.article_detail),
]
这个实现与前面的示例完全相同,只有一个细微的差别:捕获的值作为关键字参数而不是位置参数传递给视图函数。
在实际应用中,使用有命名的正则表达式组会更加明晰且不容易产生参数顺序问题的错误 —— 你可以在你的视图函数定义中重新安排参数的顺序。 当然,这些好处是以简洁为代价的;一些开发人员发现命名组语法丑陋而且太冗长。
无名正则表达式组和有名正则表达式组不能混着用!!!
# 要么都不命名
url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
# 要命名都要命名
url(r'^articles/(?P[0-9]{4})/(?P[0-9]{2})/$' , views.month_archive),
# 不能这样混着用,报错提示缺少必传位置参数
url(r'^articles/(?P[0-9]{4})/([0-9]{2})/$' , views.month_archive),
每个捕获的参数都作为一个普通的Python 字符串传递给视图,无论正则表达式使用的是什么匹配方式。 例如,
url(r'^articles/(?P[0-9]{4})/$' , views.year_archive),
传递给views.year_archive()的year参数将是一个字符串,不是整数,即使[0-9]{4}只匹配整数字符串
在这里给大家说一个方便的小技巧是指定视图参数的默认值。 URLconf 和视图的示例:
# URLconf
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^blog/$', views.page),
url(r'^blog/page(?P[0-9]+)/$' , views.page),
]
# View (in blog/views.py)
def page(request, num="1"):
# 此处省略若干行代码...
在上面的例子中:
两个URL指向同一个视图views.page
但是第一个不会从URL 中捕获任何值。 如果第一个匹配成功,page() 函数中num将使用默认的参数值"1"。
如果第二个模式匹配,`page()` 将使用正则表达式捕获的`num` 值。
说明我们视图函数中的普通参数变为默认参数后,可以让我们的视图函数变的更灵活,这样我们可以让一个视图函数被多种路由去灵活使用。