博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django之url路由
阅读量:6716 次
发布时间:2019-06-25

本文共 5340 字,大约阅读时间需要 17 分钟。

Django之url路由

 

 

url路由介绍

url路由是关联url及其视图函数关系的过程。

作用就是使views里面处理数据的函数与请求的url建立映射关系

 

 

url路由配置

Django的url路由配置在settings.py文件中ROOT_URLCONF变量指定全局路由文件名称。

  

注意:默认创建项目的时候,就会配置好,如果想使用别的配置文件自行修改。

 

 

Django的URL路由流程

  • Django查找全局urlpatterns变量(urls.py)
  • 按照先后顺序,对URL逐一匹配urlpatterns每个元素
  • 找到第一个匹配时停止查找,根据匹配结果执行对应的处理函数。
  • 如果没有找到匹配或出现异常,Django进行错误处理

 

 

 urlpatterns

Django的路由都写在urls.py文件中的urlpatterns列表中,由path()或re_path()作为元素组成。Urlpatterns中的path()处理字符串路由,re_path处理正则表达式路由。

  

urlpatterns的格式:

urlpatterns=[    path(route,views.函数名,向处理函数提供的额外参数,以字典形式表示,该URL模式的别名),    re_path(正则表达式,view.对应的处理函数),]

  

参数详解:

url()函数可以传递4个参数,其中2个是必须的:regex和view,以及2个可选的参数:kwargs和name。下面是具体的解释:regex:正则表达式性能注释:正则表达式会进行预先编译当URLconf模块加载的时候,因此它的匹配搜索速度非常快,你通常感觉不到。view:对应的视图处理函数kwargs:任意数量的关键字参数可以作为一个字典传递给目标视图。name:对你的URL进行命名,可以让你能够在Django的任意处,尤其是模板内显式地引用它。相当于给URL取了个全局变量名,你只需要修改这个全局变量的值,在整个Django中引用 它的地方也将同样获得改变。这是极为古老、朴素和有用的设计思想,而且这种思想无处不在。

  

不同的route形式:

Django支持三种表达route:1、       精确字符串格式:articles/2017/一个精确URL匹配一个操作函数;最简单的形式,适合对静态URL的响应;URL字符串不以“/”开头,但要以“/”结尾 2、       Django的转换格式:
<类型:变量名>
,articles/
/是一个URL模版,匹配URL同时在其中获得一批变量作为参数;是一种常用形式,目的是通过URL进行参数获取和传递3、 正则表达式格式:articles/(?p
[0-9]{4})/

 

 

最基础映射

urls.py

from django.contrib import adminfrom django.urls import pathfrom blog import  viewsurlpatterns = [path('articles/2017/', views.index1),]

                  

view.py

from django.shortcuts import render,HttpResponsedef index1(req):    return HttpResponse("index1")

  

访问http://127.0.0.1:8080/articles/2017/时页面返回:index

 

 

分组匹配

使用正则表达式获取url匹配结果,传给后端。有几个分组,就有几个参数。

urls.py

from django.contrib import adminfrom django.urls import pathfrom django.urls import re_pathfrom blog import  viewsurlpatterns = [re_path("articles/(\d{4})/(\d{2})/", views.index2),]

  

view.py

from django.shortcuts import render,HttpResponsedef index2(req,year,month):    return HttpResponse("index2:"+"%s,%s"%(year,month))

  

访问http://127.0.0.1:8080/articles/2017/12/时:返回index2:2017,12

 

 

 

分组命名匹配

 也可以将匹配结果发给后端。但是指定分组名字后,参数名必须和分组名相同。

 

urls.py

 

from django.contrib import adminfrom django.urls import pathfrom django.urls import re_pathfrom blog import  viewsurlpatterns = [re_path('articles/(?P
[0-9]{4})/(?P
[0-9]{2})/', views.index3),]

 

view.py

from django.shortcuts import render,HttpResponsedef index3(req,year,month):    return HttpResponse("index3:"+"%s,%s"%(year,month))

  

访问http://127.0.0.1:8080/articles/2017/12时返回:index3:2017,12

注意:分组匹配和分组命名匹配两种方式不能混用

 

 

多个app分流

默认新建的app下面是没有路由模块urls.py,但是当网站结构增大的时候,我们需要将流量分开,即在每个应用下新建自己的路由模块。

工程/urls.pyfrom app01 import urlsurl(r'^app01/', include(urls))app01/urls.py # 二级路由模块

  

 

现在我们的全部放在全局的urls.py文件中当我们的url匹配全部放在一个文件时,这样肯定可以,但是不方便当我们的应用文件变多时,最好是把不同应用的url放在不同的应用文件的urls.py下,就是在每一个应用文件下都有一个url路由不同的应用的url匹配互不影响现在我们将以下这个全局的urls.py文件进行分发url配置:from django.contrib import adminfrom django.urls import pathfrom django.urls import re_pathfrom blog import  viewsurlpatterns = [    path('admin/', admin.site.urls),    path('show_time/',views.show_time),    path('articles/2017/', views.index1),    re_path("articles/(\d{4})/(\d{2})/", views.index2),    re_path('articles/(?P
[0-9]{4})/(?P
[0-9]{2})/', views.index3), ]

  

 

 

全局的urls.pyfrom django.contrib import adminfrom django.urls import path,includefrom django.urls import re_pathfrom blog import  viewsurlpatterns = [    path('admin/', admin.site.urls),    path('show_time/',views.show_time),    path('blog/', include('blog.urls')),]blog应用文件下的urls.pyfrom django.contrib import adminfrom django.urls import path,includefrom django.urls import re_pathfrom blog import  viewsurlpatterns = [    #什么意思:只要以blog开头的url都给分发到blog.urls    path('articles/2017/', views.index1),    re_path("articles/(\d{4})/(\d{2})/", views.index2),    re_path('articles/(?P
[0-9]{4})/(?P
[0-9]{2})/', views.index3),]刚才没有在应用设置urls.py文件时,访问一个url直接在全局的urls.py下映射到视图函数现在设置应用下的urls.py文件后,访问一个url,如:path('show_time/',views.show_time)就会匹配映射视图函数如:path('blog/', include('blog.urls')),会到应用文件下的urls.py下去匹配url,然后映射给视图函数处理注意:原先:http://127.0.0.1:8080/articles/2019/12现在:http://127.0.0.1:8080/blog/articles/2019/12/ (现在访问需要加上blog,因为先要匹配上blog目录,才能到blog下匹配url)

  

 

 

 

 

url反向解析

  • 当urls.py文件中的路由改变时,导致网页需要重新修改。主要原因时跳转是根据路由来实现的,当页面中的<a href="..." >写死的时候,修改页面会导致出错。

  • 本质上就是给url匹配模式起别名,然后用过别名拿到具体的URL路径。

下面我们演示一次用户注册页面::

理解:url反向解析

理解:Django的路由不考虑HTTP请求方式,仅根据URL进行路由,即只要URL相同,无论POST、GET等哪种请求方式都指向同一个操作函数。

html代码

    
Title

文本框:

密码框:

单选框:男

复选框:音乐电影

下拉输入项:

提交按钮:

重置按钮:

View Code

 

urls.py

from django.contrib import adminfrom django.urls import pathfrom blog import  viewsurlpatterns = [    path("register.html/",views.register),]
View Code

 

view.py

def register(req):    print(req.GET)    if req.method=="POST":        print("success!")    return render(req,"register.html")
View Code

 

1.浏览器访问http://127.0.0.1:8080/register.html(第一次请求为get请求)

2.填写数据,提交数据(第二次请求为from表单的处理url)

3.在服务端查看数据

 

 现在我们改变from表单提交方法为POST

然后注释django的setting文件下的MIDDLEWARE的这一下行

'django.middleware.csrf.CsrfViewMiddleware'

  

然后重新提交数据,你会发现会打印success

不管get还是post请求,都会教给对应的视图函数处理!!!

 

 

现在我们改变urls.py

path("register.html/",views.register)
path("register.html/",views.register,name="reg")

 

 

怎么使用?

先在<head>标签下加这一行代码:{% load staticfiles %}

在需要使用的地方:

  

 

 

转载于:https://www.cnblogs.com/-wenli/p/10398509.html

你可能感兴趣的文章
Linux:sheel脚本for的用法,及日期参数+1day用法
查看>>
GetKeyState(), GetAsyncKeystate(), GetKeyboardSlate()
查看>>
函数式编程
查看>>
spring boot mybatis没有扫描jar中的Mapper接口
查看>>
ijkPlayer 集成
查看>>
Python 文件 writelines() 方法
查看>>
背水一战 Windows 10 (76) - 控件(控件基类): Control - 基础知识, 焦点相关, 运行时获取 ControlTemplate 和 DataTemplate 中的元素...
查看>>
比特币的区块结构解析
查看>>
图像滤镜艺术---Glow Filter发光滤镜
查看>>
[离散时间信号处理学习笔记] 14. 多采样率信号处理
查看>>
create-react-app 引入 antd 及 解决 antd 样式无法显示的bug
查看>>
获取图形验证码
查看>>
值得 .NET 开发者了解的15个特性
查看>>
Fresco-Facebook的图片加载框架的使用
查看>>
Android Runtime Stats
查看>>
InstallShield卸载状态
查看>>
CentOS7 修改主机名
查看>>
小工具:天气查询 Vs自定义设置 DevGridControl中GridView排序问题 小工具:火车票查询 小工具:邮件发送 小工具:截图&简单图像处理...
查看>>
11.QT-布局管理器(Box,Grid,Form,Stacked)
查看>>
用 Anaconda 完美解决 Python2 和 python3 共存问题
查看>>