Django之url路由

url路由介绍

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

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

url路由配置

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

  

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

Django的URL路由流程

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

urlpatterns

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

  

urlpatterns的格式:

  1. urlpatterns=[
  2.  
  3. path(routeviews.函数名,向处理函数提供的额外参数,以字典形式表示,该URL模式的别名),
  4.  
  5. re_path(正则表达式,view.对应的处理函数),
  6.  
  7. ]

  

参数详解:

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

  

不同的route形式:

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

最基础映射

urls.py

  1. from django.contrib import admin
  2. from django.urls import path
  3. from blog import views
  4.  
  5. urlpatterns = [
  6. path('articles/2017/', views.index1),
  7.  
  8. ]

  

view.py

  1. from django.shortcuts import render,HttpResponse
  2. def index1(req):
  3. return HttpResponse("index1")

  

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

分组匹配

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

urls.py

  1. from django.contrib import admin
  2. from django.urls import path
  3. from django.urls import re_path
  4. from blog import views
  5.  
  6. urlpatterns = [
  7. re_path("articles/(\d{4})/(\d{2})/", views.index2),
  8.  
  9. ]

  

view.py

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

  

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

 

分组命名匹配

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

urls.py

  1. from django.contrib import admin
  2. from django.urls import path
  3. from django.urls import re_path
  4. from blog import views
  5.  
  6. urlpatterns = [
  7. re_path('articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/', views.index3),
  8.  
  9. ]

 

view.py

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

  

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

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

多个app分流

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

  1. 工程/urls.py
  2. from app01 import urls
  3. url(r'^app01/', include(urls))
  4.  
  5. app01/urls.py # 二级路由模块

  

  1. 现在我们的全部放在全局的urls.py文件中
  2. 当我们的url匹配全部放在一个文件时,这样肯定可以,但是不方便
  3. 当我们的应用文件变多时,最好是把不同应用的url放在不同的应用文件的urls.py下,就是在每一个应用文件下都有一个url路由
  4. 不同的应用的url匹配互不影响
  5. 现在我们将以下这个全局的urls.py文件进行分发url配置:
  6. from django.contrib import admin
  7. from django.urls import path
  8. from django.urls import re_path
  9. from blog import views
  10.  
  11. urlpatterns = [
  12. path('admin/', admin.site.urls),
  13. path('show_time/',views.show_time),
  14. path('articles/2017/', views.index1),
  15. re_path("articles/(\d{4})/(\d{2})/", views.index2),
  16. re_path('articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/', views.index3),
  17.  
  18. ]

  

  1.  
  2. 全局的urls.py
  3. from django.contrib import admin
  4. from django.urls import path,include
  5. from django.urls import re_path
  6. from blog import views
  7. urlpatterns = [
  8. path('admin/', admin.site.urls),
  9. path('show_time/',views.show_time),
  10. path('blog/', include('blog.urls')),
  11. ]
  12.  
  13. blog应用文件下的urls.py
  14. from django.contrib import admin
  15. from django.urls import path,include
  16. from django.urls import re_path
  17. from blog import views
  18. urlpatterns = [
  19. #什么意思:只要以blog开头的url都给分发到blog.urls
  20. path('articles/2017/', views.index1),
  21. re_path("articles/(\d{4})/(\d{2})/", views.index2),
  22. re_path('articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/', views.index3),
  23. ]
  24.  
  25. 刚才没有在应用设置urls.py文件时,访问一个url直接在全局的urls.py下映射到视图函数
  26. 现在设置应用下的urls.py文件后,访问一个url,如:path('show_time/',views.show_time)就会匹配映射视图函数
  27. 如:path('blog/', include('blog.urls')),会到应用文件下的urls.py下去匹配url,然后映射给视图函数处理
  28. 注意:
  29. 原先:http://127.0.0.1:8080/articles/2019/12
  30. 现在: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代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8.  
  9. <form action="http://127.0.0.1:8080/register.html/" method="get" >
  10. <p>文本框:<input type="text" name="username" placeholder="姓名"></p>
  11. <p>密码框:<input type="password" name="passwd" placeholder=" 密码"></p>
  12. <p>单选框:男<input type="radio" name="gender" value="men"><input type="radio" name="gender" value="women"></p>
  13. <p>复选框:音乐<input type="checkbox" name="hobby" value="music">电影<input type="checkbox" name="hobby" value="movice"></p>
  14. <p>下拉输入项:
  15. <select name="生日">
  16. <option value=""></option>
  17. <option value=""></option>
  18. <option value=""></option>
  19. </select>
  20. </p>
  21. <p>提交按钮:<input type="submit"></p>
  22. <p>重置按钮:<input type="reset"></p>
  23.  
  24. </form>
  25. </body>
  26. </html>

urls.py

  1. from django.contrib import admin
  2. from django.urls import path
  3. from blog import views
  4.  
  5. urlpatterns = [
  6. path("register.html/",views.register),
  7. ]

view.py

  1. def register(req):
  2. print(req.GET)
  3. if req.method=="POST":
  4. print("success!")
  5. return render(req,"register.html")

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

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

3.在服务端查看数据

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

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

  1. 'django.middleware.csrf.CsrfViewMiddleware'

  

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

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

现在我们改变urls.py

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

怎么使用?

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

在需要使用的地方:

  1. <form action={% url 'reg' %} method="get" >

  

  1.  

Django之url路由的更多相关文章

  1. Django 02 url路由配置及渲染方式

    Django 02 url路由配置及渲染方式 一.URL #URL #(Uniform Resoure Locator) 统一资源定位符:对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是 ...

  2. 3/19 Django框架 url路由配置及模板渲染

    3/19 Django框架 url路由配置及模板渲染 1.路由分配 URL(Uniform Resoure Locato):统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示, ...

  3. django中url路由配置及渲染方式

    今天我们学习如何配置url.如何传参.如何命名.以及渲染的方式,内容大致有以下几个方面. 创建视图函数并访问 创建app django中url规则 捕获参数 路径转换器 正则表达式 额外参数 渲染方式 ...

  4. Django的URL路由系统

    一. URL配置 URL配置就像Django所支撑网站的目录.它的本质是URL与要为该URL调用的视图之间的映射表.你就是以这种方式告诉Django,对于哪个URL调用的这段代码. 基本格式 from ...

  5. Django之URL路由系统

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

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

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

  7. Django的URL路由基础

    一.概述 URL路由在Django项目中的体现就是urls.py文件,这个文件可以有很多个,但绝对不会在同一目录下.实际上Django提倡项目有个根urls.py,各app下分别有自己的一个urls. ...

  8. Django( 学习第三部 Django的url路由层)

    目录 url路由层 路由匹配(有名分组与无名分组) 反向解析 路由分发 名称空间(了解) Django版本区别 url 路由匹配 注意事项: url方法,第一个参数是正则表达式,只要第一个参数能够匹配 ...

  9. Django的URL路由

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

随机推荐

  1. Oracle 数据备份与恢复

    前言 一:备份与恢复概述 二:RMAN 工具概述 1: RMAN 组件 1: RMAN命令执行器 [oracle@localhost ~]$ rman target system/nocatalog ...

  2. Confluence 6 MySQL 3.x 字符集编码问题

    MySQL 3.x is 已知在大写和小写转换的时候有些问题(non-ASCII). 问题诊断 请按照 Troubleshooting Character Encodings 页面中的内容对问题进行诊 ...

  3. Confluence 6 Confluence 安装目录

    Confluence 安装的目录(Confluence Installation directory)定义的是 Confluence 是在那里进行安装的.这个目录有时候也被称为 Confluence ...

  4. LeetCode(71):简化路径

    Medium! 题目描述: 给定一个文档 (Unix-style) 的完全路径,请进行路径简化. 例如,path = "/home/", => "/home&quo ...

  5. Eclipse搭建.C#和..NET Core环境

    1.在上一篇博客中我介绍了如何使用Eclipse搭建C++.C开发环境,顺带把搭建 .NET Core 和C#也做个介绍.配置任何环境关键是找到要开发语言的编辑器和SDK.eclipse是java开发 ...

  6. 论文阅读笔记三十三:Feature Pyramid Networks for Object Detection(FPN CVPR 2017)

    论文源址:https://arxiv.org/abs/1612.03144 代码:https://github.com/jwyang/fpn.pytorch 摘要 特征金字塔是用于不同尺寸目标检测中的 ...

  7. Python练习题

    内置函数 # 5.随意写一个20行以上的文件# 运行程序,先将内容读到内存中,用列表存储.# 接收用户输入页码,每页5条,仅输出当页的内容 def user_check(filename,num=5) ...

  8. bootstrap 三个文件的引入

    <!-- 新 Bootstrap 核心 CSS 文件 --> <link rel="stylesheet" href="//cdn.bootcss.co ...

  9. 20165206 2017-2018-2 《Java程序设计》第五周学习总结

    20165206 2017-2018-2 <Java程序设计>第五周学习总结 教材学习内容总结 内部类:支持在一个类中定义另一个类的类. 外嵌类:包含内部类的类,称为内部类的外嵌类. 匿名 ...

  10. 前后台交互经常使用的技术汇总(后台:Java技术,前台:Js或者Jquery)

    1:由于针对特定的前后台交互用到的知识总结,所以不大量贴代码,主要给出思路,方便自己以后脑补和技术总结,当然也希望可以帮助到别人. 后台Json和其他格式转化,之前总结过Json和对象,集合,字符串的 ...