黑马程序员
微信号:heiniu526
传智播客旗下互联网资讯,学习资源免费分享平台
Django中路由的作用: 其本质是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参数,用于反向解析"""
from django.conf.urls import urlfrom . import viewsurlpatterns = [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 urlfrom app01 import viewsurlpatterns = [url(r'^index/$', views.index), # 结尾加'/' url(r'^test$', views.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 urlfrom . import viewsurlpatterns = [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 和视图的示例: # URLconffrom django.conf.urls import urlfrom . import viewsurlpatterns = [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 值。 通过上面例子,你发现了什么呢? 说明我们视图函数中的普通参数变为默认参数后,可以让我们的视图函数变的更灵活,这样我们可以让一个视图函数被多种路由去灵活使用。 热点文章◆ 这个学科100%就业 ,平均薪资9612元/月,但我劝你不要埋头苦学!
◆ 仅仅毕业一日,最高薪资14k,就业率就突破60%…这个学科为何如此燃?
◆ TIOBE 8 月编程语言排行榜:别再关注Java、python了!该重视它了!!
我就知道你会 “在看”▼点击 加程序员交流群