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映射都是从上到下按顺序匹配,遇到第一个匹配成功后就不在往下进行了。

Django之url映射的更多相关文章

  1. django中“url映射规则”和“服务端响应顺序”

    1.django搜索路径 使用 import 语句时,Python 所查找的系统目录清单.      查看方式:         import sys        print sys.path   ...

  2. Django - 将URL映射到视图

    URLconf 就像是 Django 所支撑网站的目录.它的本质是 URL 模式以及要为该 URL 模式调用的视图函数之间的映射表.你就是以这种方式告诉 Django,对于这个 URL 调用这段代码, ...

  3. Django路由系统---django重点之url映射分发

    django重点之url映射分发 在全局项目的urls.py中进行子项目的映射,然后在子项目中创建一个urls.py去处理自己项目中的请求,同时也实现了代码的解耦 添加路由分发的原则[全局urls.p ...

  4. 第十九章 Django的ORM映射机制

    第十九章 Django的ORM映射机制 第一课 Django获取多个数据以及文件上传 1.获取多选的结果(checkbox,select/option)时: req.POST.getlist('fav ...

  5. Django之URL路由系统

    一 URL配置 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表.你就是以这 ...

  6. Django之url路由

    Django之url路由 url路由介绍 url路由是关联url及其视图函数关系的过程. 作用就是使views里面处理数据的函数与请求的url建立映射关系 url路由配置 Django的url路由配置 ...

  7. Django之URL(路由系统)用法

    路由系统 路由系统概念 简而言之,路由系统就是路径和视图函数的一个对应关系.django的路由系统作用就是使views里面处理数据的函数与请求的url建立映射关系.使请求到来之后,根据urls.py里 ...

  8. django的url配置

    在一个请求到达的时候,最先达到的就是视图层,然后根据url映射到视图函数.这一部分我们来说明url的配置. 概述 为了给一个应用设计URL,你需要创建一个Python 模块,通常称为URLconf(U ...

  9. Django之URL控制器(路由层)

    url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive), 一.视图层路由配置系统 URL配置(URLconf)就像Django ...

随机推荐

  1. mysql使用pdo简单封装select语句

    最终代码: function pdo_array_query($pdo, $table_name, $data, $fields=array('*')){ //Will contain SQL sni ...

  2. Python面试题目--汇总

    原文链接-https://github.com/taizilongxu/interview_python Python语言特性 1 Python的函数参数传递 2 Python中的元类(metacla ...

  3. (转)Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring

    Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring Mybatis在与Spring集成的时候可以配置MapperFactoryBea ...

  4. elasticSearch6源码分析(6)http和transport模块

    1.http模块概述 The http module allows to expose Elasticsearch APIs over HTTP. The http mechanism is comp ...

  5. Spring Security基本配置

    Spring Security 是一个功能强大且可高度自定义的身份验证和访问控制框架. 它是保护基于Spring的应用程序的事实上的标准.Spring Security 是一个专注于为Java应用程序 ...

  6. 入门angularJs笔记手记一

    angularjs表达式: ng-init ng-bind ng-app ng-model输入域的值绑定到程序 ng-repeat重复一个HTML元素 自定义指令: <script> va ...

  7. VirtualBox配置centos7静态ip(详解)

    VirtualBox安装centos7配置静态ip地址可以本机访问,可以联网. 在开始之前先说一下,不知道为什么,我在网上百度的大多数是不能用的,或者只能主机访问,或者只能联网. 我的配置文件为ifc ...

  8. Hashmat the brave warrior(UVa10055)简单题

    Problem A Hashmat the brave warrior Input: standard input Output: standard output Hashmat is a brave ...

  9. 华中农业大学第五届程序设计大赛网络同步赛-L

    L.Happiness Chicken brother is very happy today, because he attained N pieces of biscuits whose tast ...

  10. grafana-simple-json-datasource 用于连接各种grafana不支持的数据源

    https://grafana.com/plugins/grafana-simple-json-datasource 1.安装方法很简单,下载后解压放到plugins目录就好. 我的是解决版的graf ...