Django之路由系统(urls.py)
URL配置又称URL分发器(URLconfig)就像Django所支持网站的目录。他的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表;以这种方式告诉Django,这个URL应该执行那个函数
1 urlpatterns = [ 2 path('正则表达式', views视图函数,参数,别名), 3 ]
参数说明:
- 一个正则表达式字符串
- 一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
- 可选的要传递给视图函数的默认参数(字典形式)
- 一个可选的name参数
注意:在Django2.0之后 ,摒弃了1.x中的url,而改用path
在1.x中,使用url()即可实现正则匹配,但是在2.0中,是否使用正则需要使用不同的方式。
path()无法使用正则;re_path()可以使用正则。
1 ?: (2_0.W001) has a route that contains '(?P<', begins with a '^', or ends with a '$'
小试牛刀:
使用正则匹配url执行对应的函数,urlspatterns中想捕获正则表达式匹配的结果用来出传递给views.py视图函数文件使用,需要用到分组匹配,或者使用第三个参数python字典进行传参。
无名分组:
位置参数:匹配出的结果按顺序依次传递给视图函数的形参(形参必须有序,匹配值按位置顺序进行传递)
正则中小括号为分组,有分组,那么这个分组得到的用户输入的内容,就会作为对应函数的位置参数传进去,别忘了形参要写两个了
有名分组:
关键字参数:匹配出的结果按照命名对应传递给视图函数的形参(形参可以无序,匹配值按命名进行传递)
(?P<year>[0-9]{4})这是命名参数,那么函数urlgroup(request,year),形参名称必须是year这个名字。而且注意如果你这个正则后面没有 写$符号,即便是输入了月份路径,也会被它拦截下拉,因为它的正则也能匹配上
1 urltest.html: 2 3 <!DOCTYPE html> 4 <html lang="en"> 5 <head> 6 <meta charset="UTF-8"> 7 <title>URLTest</title> 8 </head> 9 <body> 10 <h1>当前时间:{{ LocalTime }}</h1> 11 </body> 12 </html> 13 14 15 urls.py: 16 17 from django.urls import path,re_path 18 re_path(r'^baidu/([0-9]{2})/$',views.NewDate), 19 20 views.py: 21 22 def NewDate(req,a): 23 LocalTimes = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) 24 return render(req,"urltest.html",{"LocalTime":LocalTimes})
1 group.html: 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <meta charset="UTF-8"> 6 <title>group</title> 7 </head> 8 <body> 9 <h1>年:{{ Year }}</h1> 10 <h1>月:{{ Mes }}</h1> 11 </body> 12 </html> 13 14 15 urls.py: 16 re_path(r'^time/(?P<year>[0-9]{4})/(?P<mes>[0-9]{2})/$',views.UrlGroup), 17 18 19 views.py: 20 def UrlGroup(req,year,mes): 21 return render(req,"group.html",{"Year":year,"Mes":mes})
别名:
django url中第四个参数--别名,别名引入使Django的url配置与前端页面对url的引用完全解耦
1 urls.py: 2 3 re_path(r'^Adair/',views.time,name="times") 4 5 6 views.py: 7 8 def time(req): 9 if req.method == "POST": 10 return HttpResponse("POST OK!") 11 return render(req,"Adair.html") 12 13 Adair.html: 14 15 <!DOCTYPE html> 16 <html lang="en"> 17 <head> 18 <meta charset="UTF-8"> 19 <title>TIME</title> 20 </head> 21 <body> 22 <form action={% url "times" %} method="post"> 23 <input type="submit" name="提交"> 24 </form> 25 </body> 26 </html>
映射:
在Django项目中,一个项目可能包含多个Django应用,而每个应用都有自己的独特的url映射规则,因此,将这些url映射保存在一个urls.py文件中是不利于网站的维护,因此Django提供了url映射的功能中
在创建Django项目时,Django本身自带的urls.py为主url文件,每个新创建的应用可以创建自己独立的urls.py文件,url映射就是用主url文件映射到相应的应用url文件上
1 re_path(r'^index/',include('APP.urls'))
1 from django.contrib import admin 2 from django.urls import path,re_path,include 3 from django.conf.urls import url 4 from APP import views 5 6 urlpatterns = [ 7 re_path(r'time/(?P<year>[0-9]{4})',views.date) 8 ]
1 def date(req,year): 2 return HttpResponse(year)