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 '$'
Django 2.0 path error

 

小试牛刀:

  使用正则匹配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})
无名分组:re_path(r'^baidu/([0-9]{2})/$',views.NewDate),
 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})
有名分组:re_path(r'^time/(?P<year>[0-9]{4})/(?P<mear>[0-9]{2})/$',views.UrlGroup),

   别名:

    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>
别名:re_path(r'^Adair/',views.time,name="times")

 

   映射:

    在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'))
主URL
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 ]
应用URL
1 def date(req,year):
2     return HttpResponse(year)
视图

 

 

posted @ 2019-12-17 22:55  叶小黑  阅读(252)  评论(0编辑  收藏  举报