Django之url路由
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/<int:year>/ 是一个URL模版,匹配URL同时在其中获得一批变量作为参数;是一种常用形式,目的是通过URL进行参数获取和传递 3、 正则表达式格式:articles/(?p<year>[0-9]{4})/
最基础映射
urls.py
from django.contrib import admin
from django.urls import path
from blog import views urlpatterns = [
path('articles/2017/', views.index1), ]
view.py
from django.shortcuts import render,HttpResponse
def index1(req):
return HttpResponse("index1")
访问http://127.0.0.1:8080/articles/2017/时页面返回:index
分组匹配
使用正则表达式获取url匹配结果,传给后端。有几个分组,就有几个参数。
urls.py
from django.contrib import admin
from django.urls import path
from django.urls import re_path
from blog import views urlpatterns = [
re_path("articles/(\d{4})/(\d{2})/", views.index2), ]
view.py
from django.shortcuts import render,HttpResponse
def 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 admin
from django.urls import path
from django.urls import re_path
from blog import views urlpatterns = [
re_path('articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/', views.index3), ]
view.py
from django.shortcuts import render,HttpResponse
def 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.py
from app01 import urls
url(r'^app01/', include(urls)) app01/urls.py # 二级路由模块
现在我们的全部放在全局的urls.py文件中
当我们的url匹配全部放在一个文件时,这样肯定可以,但是不方便
当我们的应用文件变多时,最好是把不同应用的url放在不同的应用文件的urls.py下,就是在每一个应用文件下都有一个url路由
不同的应用的url匹配互不影响
现在我们将以下这个全局的urls.py文件进行分发url配置:
from django.contrib import admin
from django.urls import path
from django.urls import re_path
from blog import views urlpatterns = [
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<year>[0-9]{4})/(?P<month>[0-9]{2})/', views.index3), ]
全局的urls.py
from django.contrib import admin
from django.urls import path,include
from django.urls import re_path
from blog import views
urlpatterns = [
path('admin/', admin.site.urls),
path('show_time/',views.show_time),
path('blog/', include('blog.urls')),
] blog应用文件下的urls.py
from django.contrib import admin
from django.urls import path,include
from django.urls import re_path
from blog import views
urlpatterns = [
#什么意思:只要以blog开头的url都给分发到blog.urls
path('articles/2017/', views.index1),
re_path("articles/(\d{4})/(\d{2})/", views.index2),
re_path('articles/(?P<year>[0-9]{4})/(?P<month>[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代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body> <form action="http://127.0.0.1:8080/register.html/" method="get" >
<p>文本框:<input type="text" name="username" placeholder="姓名"></p>
<p>密码框:<input type="password" name="passwd" placeholder=" 密码"></p>
<p>单选框:男<input type="radio" name="gender" value="men">女<input type="radio" name="gender" value="women"></p>
<p>复选框:音乐<input type="checkbox" name="hobby" value="music">电影<input type="checkbox" name="hobby" value="movice"></p>
<p>下拉输入项:
<select name="生日">
<option value=""></option>
<option value=""></option>
<option value=""></option>
</select>
</p>
<p>提交按钮:<input type="submit"></p>
<p>重置按钮:<input type="reset"></p> </form>
</body>
</html>
urls.py
from django.contrib import admin
from django.urls import path
from blog import views urlpatterns = [
path("register.html/",views.register),
]
view.py
def register(req):
print(req.GET)
if req.method=="POST":
print("success!")
return render(req,"register.html")
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 %}
在需要使用的地方:
<form action={% url 'reg' %} method="get" >
Django之url路由的更多相关文章
- Django 02 url路由配置及渲染方式
Django 02 url路由配置及渲染方式 一.URL #URL #(Uniform Resoure Locator) 统一资源定位符:对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是 ...
- 3/19 Django框架 url路由配置及模板渲染
3/19 Django框架 url路由配置及模板渲染 1.路由分配 URL(Uniform Resoure Locato):统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示, ...
- django中url路由配置及渲染方式
今天我们学习如何配置url.如何传参.如何命名.以及渲染的方式,内容大致有以下几个方面. 创建视图函数并访问 创建app django中url规则 捕获参数 路径转换器 正则表达式 额外参数 渲染方式 ...
- Django的URL路由系统
一. URL配置 URL配置就像Django所支撑网站的目录.它的本质是URL与要为该URL调用的视图之间的映射表.你就是以这种方式告诉Django,对于哪个URL调用的这段代码. 基本格式 from ...
- Django之URL路由系统
一 URL配置 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表.你就是以这 ...
- Django之URL(路由系统)用法
路由系统 路由系统概念 简而言之,路由系统就是路径和视图函数的一个对应关系.django的路由系统作用就是使views里面处理数据的函数与请求的url建立映射关系.使请求到来之后,根据urls.py里 ...
- Django的URL路由基础
一.概述 URL路由在Django项目中的体现就是urls.py文件,这个文件可以有很多个,但绝对不会在同一目录下.实际上Django提倡项目有个根urls.py,各app下分别有自己的一个urls. ...
- Django( 学习第三部 Django的url路由层)
目录 url路由层 路由匹配(有名分组与无名分组) 反向解析 路由分发 名称空间(了解) Django版本区别 url 路由匹配 注意事项: url方法,第一个参数是正则表达式,只要第一个参数能够匹配 ...
- Django的URL路由
URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那 ...
随机推荐
- easyui的combobox,自动搜索的下拉框
作者:多来哈米 如图,输入关键字,左匹配检索 HTML代码 <input class="easyui-combobox" name="userId" id ...
- SpringBoot图片上传(一)
简单描述:点击上传文件的图标,上传文件,上传成功后,图标编程上传的图片. 吐槽:文件上传下载这种东西,总是感觉莫名的虚-_-|| 也不知道是造了什么孽,(其实就是IO File这一块的知识了解的不太 ...
- PDF裁剪页面,PDF怎么裁剪页面的方法
PDF文件要怎么裁剪页面呢,是不是有很多的小伙们想知道呢,当打开一个PDF文件的时候如果一个页面中有很多的空白页面就会影响文件的美观与使用,今天小编就为大家分享一下小编的裁剪页面的方法. 操作软件:迅 ...
- html5 drag 文件拖拽浅淡
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Java手动释放对象
伪代码 public void updateUser(BufferedWriter writer, BufferedReader reader) { List<User> array = ...
- 集腋成裘-02-css基础-01
CSS 层叠样式表(Cascading Style Sheets)(级联样式表) 1 选择器 1.1 写法 选择器是一个选择标签的过程. 选择器{属性:值;...} 1.2 基础选择器 标签选择器 类 ...
- Github版本管理以及git使用
1.git客户端编译安装 同步系统时间服务器 ntpdate cn.ntp.org.cn 安装依赖包: [root@baolin ~]# yum install epel-release -y [ro ...
- jQuery常见案例
jQuery常见案例 通过jQuery实现全选,反选取消: 选择 地址 端口 1.1.1.1 80 1.1.1.1 80 1.1.1.1 80 1.1.1.1 80 代码实现 <body> ...
- 关于K8S证书生成方面的脚本草稿
周日在家里计划的. 俺不加班,但在家学习的时间一样没少! 还没弄完,只粗粗弄了etcd证书. #! /usr/bin/env bash set -e set -u set -x THIS_HOST=$ ...
- jQuery字体缩放缩放插件zoomFontSize.js
插件描述:jQuery字体缩放缩放插件zoomFontSize.js根据父类进行百分比缩放,兼容性如下: 使用方法 body 的class属性 添加 changbody_fontSize 而且整个页面 ...