Django路由配置方法全解
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参数,用于反向解析 """
细说url函数的第一个参数:from django.conf.urls import url from . import views urlpatterns = [ url(r"^articles/2003/#39;, views.special_case_2003), url(r"^articles/([0-9]{4})/#39;, views.year_archive), url(r"^articles/([0-9]{4})/([0-9]{2})/#39;, views.month_archive), url(r"^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/#39;, views.article_detail), ]
注意点:
1.urlpatterns列表中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功则不再继续。
2.当请求匹配urlpatterns完所有元素后也未匹配成功,就会向客户端返回404.
3.若要从URL中捕获一个值,只需要在 ==/ /== 里放置一对圆括号,并写上对应的正则匹配即可(分组匹配)。
4.不需要添加一个前导的反斜杠,因为每个URL 默认前面就会有反斜杠。例如,应该是^articles 而不是 ^/articles。
5.每个正则表达式前面的"r" 是可选的但是建议加上。让正则字符串中任何字符都不被转义,保留原始。
路由正则表达式结尾是否要加 "/" 说明:from django.conf.urls import url from app01 import views urlpatterns = [ url(r"^index/#39;, views.index), # 结尾加"/" url(r"^test#39;, 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/#39; 路由时就必须在结尾的加上"/"。
总结:
由此测试可以说明在定义路由时结尾加上 "/ " 会让路由更加灵活。
没有命名的正则表达式组:# 将加圆括号的正则表达式匹配到的内容当做位置参数自动传递给对应的视图函数 # 路由层 url(r"^test/(d+)/",views.test), # 匹配一个或多个数字 # 视图层 def test(request, num): # num接收到从路由括号圆括号内,相应正则表达式中匹配的值 print(num) return HttpResponse("test")
有命名的正则表达式组:
在Python的正则表达式中,分组命名正则表达式组的语法是(?Ppattern),其中name是组的名称,pattern是要匹配的模式# 将加圆括号的正则表达式匹配到的内容当做关键字参数自动传递给对应的视图函数 # 路由层 url(r"^test/(?Pd+)/",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/#39;, views.special_case_2003), url(r"^articles/(?P[0-9]{4})/#39;, views.year_archive), url(r"^articles/(?P[0-9]{4})/(?P[0-9]{2})/#39;, views.month_archive), url(r"^articles/(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2})/#39;, views.article_detail), ]
这个实现与前面的示例完全相同,只有一个细微的差别:捕获的值作为关键字参数而不是位置参数传递给视图函数。
在实际应用中,使用有命名的正则表达式组会更加明晰且不容易产生参数顺序问题的错误 —— 你可以在你的视图函数定义中重新安排参数的顺序。 当然,这些好处是以简洁为代价的;一些开发人员发现命名组语法丑陋而且太冗长。
注意:
无名正则表达式组和有名正则表达式组不能混着用!!!# 要么都不命名url(r"^articles/([0-9]{4})/([0-9]{2})/#39;, views.month_archive), # 要命名都要命名 url(r"^articles/(?P[0-9]{4})/(?P[0-9]{2})/#39;, views.month_archive), # 不能这样混着用,报错提示缺少必传位置参数 url(r"^articles/(?P[0-9]{4})/([0-9]{2})/#39;, views.month_archive),
正则表达式组捕获的参数都是字符串类型:
每个捕获的参数都作为一个普通的Python 字符串传递给视图,无论正则表达式使用的是什么匹配方式。 例如,url(r"^articles/(?P[0-9]{4})/#39;, 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/#39;, views.page), url(r"^blog/page(?P[0-9]+)/#39;, views.page), ] # View (in blog/views.py) def page(request, num="1"): # 此处省略若干行代码...
在上面的例子中:
两个URL指向同一个视图views.page
但是第一个不会从URL 中捕获任何值。 如果第一个匹配成功,page() 函数中num将使用默认的参数值"1"。 如果第二个模式匹配,`page()` 将使用正则表达式捕获的`num` 值。
通过上面的例子,你发现了什么呢?
说明我们视图函数中的普通参数变为默认参数后,可以让我们的视图函数变得更灵活,这样我们可以让一个视图函数被多种路由去灵活使用。
东京奥运会出现首例兴奋剂事件,为什么运动员不能使用兴奋剂?就在今天7月31号,田径诚信机构宣布,一位来自尼日利亚的短跑女将奥卡巴雷,在接受药检的时候被查出使用兴奋剂,导致药检不合格被禁赛,这是目前为止东京奥运会开幕后发现的首例兴奋剂事件。
格局人生不设限,成功无上限只要有心,没有什么是不可能的。假设我们种一棵榕树,很细心地将它种在小盆子里,每天小心翼翼地看顾,用心去浇灌施肥,但过了五年十年甚至二十年,这棵榕树还是长不大,为什么?因为它的生长范
智者学派浅析通俗地说,智者派这帮人就是传销界祖师爷,他们不是纯粹的哲学家,而是以教授修辞学,即怎么使得话说的漂亮文法诡辩为一体的老师。希波战争的胜利,使得雅典民主发展到顶峰。民主政治使得人人都
旧宫殿时间雕刻着每一片砖瓦在中国的古迹中,没有一处像故宫这样拥有显赫的位置,如同一条无用的旧闻,却仍占据着头版头条。对于许多从没进去过的人来说,故宫是他们想象中的天堂。在很长的时间中,只有很少数身份高贵的人
米利都学派浅析哲学的起源话说人类从树上刚下来,还尚未进入文明社会,但是随着人类不断调动智能,发现这个世界是如此的丰富多彩,但是又变化不定,可是如果世界是变化不定的,都不知道明天的世界和今天的世界
中年仍要征战,刘邦之难在于己公元前202年,定陶县,刘邦坐在皇位上俯瞰天下。八年征战,终于换来今日的万人瞩目。就在不久前,他终于打败了项羽,成为天下的半个主人。为什么是半个?因为他的盟友们也要享受胜利果实,分
康德先验哲学第三组二律背反的正命题的论证1假设不存在自由因果性。2那么按照自然因果性一直追溯下去便没有一个绝对第一因。3那么这种找不到第一因的情况,便违背了自然律因果性的固有性质即一切事情的发
叔本华浅析充足理由律要了解叔本华的哲学,就要回头看传统哲学遗留下什么问题。康德哲学的问题就是物自体既然是不可知的,何以说他存在呢?而柏拉图解释不清理念从何而来又怎么派生出万物?康德其实划定了
贝克莱浅析从笛卡尔说起笛卡尔认为一切都值得怀疑,但有一个不可怀疑的基石,就是思本身,所以提出我思故我在。这个思想有两个含义思成为确证存在的一个方式,也就是意识之外的存在实际上被悬置起来了思出
卢梭哲学浅析不平等起源自然法学派普遍认为,人类进入文明社会以前有一段自然状态,霍布斯将其表述为战争状态,卢梭却表述为淳朴状态。卢梭认为,在自然状态人们过着离群索居的生活,诸如贪婪嫉妒等情感尚未
尼采哲学浅析酒神和日神酒神就是狄奥尼索斯,日神就是阿波罗,分别是古希腊神话中的两位神袛。酒神象征意志和本能,表现一种追求丰产的愿望,表现为惊骇狂烈的情绪放纵力量。日神象征理性,象征美的外观和无