• Django之url映射


    url映射的作用

    根据Django的MTV模式,url的映射是根据用户输入或传送而来的url路径,来进行区分去执行相应的view函数来响应用户的操作。

    url映射的方式

    Django项目的创建后,会自动创建和你项目名称相同的全局文件包,urls.py就在其中。

    
    urlpatterns = [
        path('admin/', admin.site.urls),
    ]
    

    这是Django自动添加的一条映射。我们的view函数在自己创建的app中,所以需要先引入app文件包中的views

    
    from blog import views
    

    这样就可以在urlpatterns中添加自己的映射条件,例如

    
    from blog import views
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('blog/',views.blog)
    
    ]
    

    写相应的视图函数

    
    from django.shortcuts import render,HttpResponse
    
    def blog(request):
        return HttpResponse("WELCOME")
    

    这样在浏览器中输入127.0.0.1:8000/blog/就能看到返回的WELCOME了。

    url映射的函数

    urlpatterns中可以使用两种函数,path()用来字符串路由,re_path()处理正则式路由。

    path函数

    必须有的参数

    path()中有两个必须填的参数,一个是路径字符串,一个是所调用的函数。
    就如上边的例子

    
    path('blog/',views.blog)
    

    这个只匹配在你的路径后加上blog/的情况,然后执行views下的blog函数,表示静态,精确的映射。
    路径字符串除了填精确的路径外,还可以填<类型:变量名>,可以在匹配 url的同时传递参数,而且匹配的范围更加庞大。例如:

    
    path('<int:year>/year/',views.year)
    

    可以匹配”任意整型数字/year/“,并且匹配到的整型数字还会以变量名为year的形式作为参数传递给views.year函数。这里注意:views.year函数的参数名必须和你在url映射时起的名字相同,即“year”。
    这里的数据类型还有其他几种:

    数据类型说明
    str 匹配除分隔符(/)外的非空字符
    int 匹配0和正整数
    slug 匹配字母、数字、横杠、下划线组成的字符串,str的子集
    uuid 匹配格式化的UUID,如075194d3-6885-417e-a8a8-6c931e272f00
    path 匹配任何非空字符串,包括路径分隔符,是全集
    非必要参数

    path中的非必要参数也有两个,一个是用来给视图函数传递的参数,一个是别名。
    用来给视图函数传递的参数除了上述直接在url中,还可以手动指定填入path()中,以字典的形式填入,因为这里的参数类型为**kwargs。而视图函数中的参数同样必须和字典中的键名相同。例如:

    
    path('<int:year>/year/',views.year,{"name":"sfencs","age":20})
    
    def year(req,year,name,age):
        str1=str(year)+" "+name+" "+str(age)
        return HttpResponse(str1)
    

    如果url参数和字典类型参数都使用了,并且名称相同,如:

    
    path('<int:year>/year/',views.year,{"name":"sfencs","year":20})
    

    那么在视图函数中只能添加一个year参数,并且在字典中的year的数据20会覆盖掉url中的数据。
    最后一个参数是别名,例如:

    
    path('blog/',views.blog,name="abc")
    

    在html中,form表单提交的路径就可以使用abc来代替/blog/,具体方式为

    
    <form action="{% url 'alias' %}" method="post">
    

    这种方式只允许在前端中使用,在地址栏中通过使用别名的方式访问是不起作用的。

    re_path()函数

    re_path()函数和path()函数类似,但它是使用正则表达式的模式来代替字符串模式进行匹配,只要符合正则式的模式就可以匹配成功。

    
    re_path("^d+/day/",views.day)
    

    这里也可以通过url来传递参数,使用的是正则式分组的方式

    
    re_path("^(d+)/day/",views.day)
    

    没有给分组起名字的模式,即为无命名参数,分组所匹配的数据会自动当参数传递给视图函数,但是视图函数的形参必须要多写一个参数,名字任意。

    
    re_path("^(?P<day>d+)/day/",views.day)
    

    上面这种为命名参数,视图函数必须以其名字作为参数名,同样,如果手动添加的参数与其名称相同,那么手动添加的参数数据会将正则式中的覆盖。

    路由分发

    假如我们一个项目中有多个app,那么所有的映射都写到同一个urls.py,或者公用一个url,难免会产生错误,产生混淆,那么我们可以在每个app下建立自己的urls.py来处理自己的映射关系,在全局urls下进行分发。具体方式为:
    在全局urls中添加

    
    path('blog/',include('blog.urls'))
    

    在blog文件夹下创建urls.py文件,在文件中写入

    
    from django.urls import path,re_path
    from blog import views
    
    urlpatterns = [
        path("login/",views.login)
    
    ]
    

    那么在地址栏中输入/blog/login,就会先由全局urls分发到blog下的urls,再进行相应的视图函数映射。


    • 最后有一点要注意,所有的url映射都是从上到下按顺序匹配,遇到第一个匹配成功后就不在往下进行了。
  • 相关阅读:
    8.18 二讲背包问题之完全背包
    8.18 动态规划——背包问题之01背包
    8.17 动态规划——书的抄写
    7.25 二分查找模板
    7.19 股票问题
    7.12 枚举-Jam的计数法
    7.12 递归——双色hanoi塔问题
    7.11 NOIP2007普及组第3题 守望者的逃离
    高数之泰勒公式
    数据结构_线性表之链表(1)
  • 原文地址:https://www.cnblogs.com/sfencs-hcy/p/9892361.html
Copyright © 2020-2023  润新知