Django的日常-路由层
Django的日常-2
路由层
我们之前已经接触过路由层,只是我们可能不知道他叫这个名字,实际上在Django里面路由层指的就是urls.py这个文件.
路由的概念是什么,我们平时生活中接触最多的和路由有关的大概就是路由器了,那么路由器是干嘛的?
路由器是连接多个网络的硬件设备,在网络之间起到网关的作用,可以对不同网络的网络之间的数据包进行处理和转发.
Django里面的路由层与此作用有些类似,路由即请求地址和视图函数的映射关系,如果我们把一个网站比喻成一本书的话,那么路由就是这本书的目录,也可以说是索引.
urls.py里面配置的模板为:
# urls.py
from django.conf.urls import url #这里导入url,要注意的是Django在版本为1.x的时候是用的url,但是在版本为2.x的时候用的是path,且用法不太一样,2.x版本的re_path的用法是完全继承于url的,但是path不能,最大的区别就在于path不能用正则来匹配网址
urlpatterns = [
url(regex, view, kwargs=None, name=None), # url本质就是一个函数
]
# regex:正则表达式,用来匹配url地址的路径部分,
# 例如url地址为:http://127.0.0.1:8001/index/,正则表达式要匹配的部分是index/
# view:通常为一个视图函数,用来处理业务逻辑
# 举个栗子:
urlpatterns = [
url(r'^admin/', admin.site.urls), # 系统默认的
url(r'test/$', views.test), # 严格正则,必须一个字不差才能进去该网页
url(r'^$', views.home), # 网站首页,只有网站的首页不含任何后缀,所以通常用这种写法来转到网站首页
# url(r'test/[0-9]{4}', views.test), #正则匹配,数字,且必须是四位
url(r'', views.errors) # 自定义报错404页面,与网站首页不同,这个定义一定要放在最后面,不能放在前面,不然会阻止下方url的判断
]
# 这里有几个注意事项:
1. url第一个参数是一个正则表达式
2. 一旦匹配上了,会立刻执行对应的视图函数,不再往下匹配
3. ^ 可以限制其开头,$可以限制其结尾,这是正则匹配里面的内容
还有一个小问题,其实有时候我们在输入网址的时候,没有加最后面的左下划线,可是网页还是跳转成功了,这是因为Django里面会有这个配置,在settings.py文件里面,在最后我们可以定义一个
APPEND_SLASH = False
# 因为Django里面这个值默认为True,也就是默认会补齐,实际情况是补上左下划线再尝试一次,并不是补齐的概念
比如,我们在设置过这个选项之后,在输入以下网址 http://127.0.0.1:8000/index
当前,前提是你已经设置过urls以及写了一个views函数名为index
我们可以在网页F12的检查里面的network标签里看到两个请求,一个是index,一个是index/,
而index的请求状态码为301,也就是重定向,index/的状态码为200,这才是我们最后看到的网页的结果
有名分组和无名分组
首先,分组,我们知道分组的目的就是为了把有相同特质的事物分到一起,便于查找和管理,Django里面也是如此的,我们把相似内容或者格式的网页分到一组,可以让我们更方便的管理网页.
那么在分组之后我们应该怎么调用这些网页呢,比如我们在http://127.0.0.1:8000/index/
这个后缀下面建立了100个网页,从http://127.0.0.1:8000/index/1
到http://127.0.0.1:8000/index/100
那么难道我们需要在urls.py里面写一百条语句?
非也,此时我们分组的重要性就体现出来了.分组可以完美解决这个问题,下面我们就来介绍两种分组方式,无名分组和有名分组
无名分组
# 无名分组的方式大致如下
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),#这个是默认的,不用管
# 下述正则表达式会匹配的部分为:index/数字/,匹配成功的分组部分会以位置参数的形式传给视图函数,注意,是位置参数,我们在views.py里面接收参数的时候要注意格式,要定义成index(request,*args)
url(r'^index/(\d+)/$',views.index),
]
# 这样分组的情况下,我们输入的网址,但凡前缀是http://127.0.0.1:8000/index/,后面加的一个纯数字的网址,都可以匹配进入index这个函数,然后执行
有名分组
#有名分组如下
# 无名分组的方式大致如下
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),#这个是默认的,不用管
# 匹配的方式和无名分组相似,但是,匹配成功的部分是以关键字参数的形式传输的,注意,是关键字参数,我们在views.py里面接收参数的时候要注意格式,要定义成index(request,**kwargs)
url(r'^index/(?P<year>\d+)/$',views.index),# 分组,取名为year
]
这里要强调一点的是,有名分组和无名分组不能混合使用,也就是说同一个URL里面,可以有多个有名分组,也可以有多个无名分组,但是不能同时包含有名分组和无名分组.
反向解析
在说反向解析之前,我们要知道解析的概念,在Django里面,解析的概念就是我们写好后端和前端,运行起来,前端把自己的代码翻译出来,当别人输入网址就自动跳转到这个界面,大概就是解析的概念,解析的关键在于通过正确的路径获取到一个对象,或者一个网址.
那么反向解析的概念也就出来了,反向解析就是我们从一个别名,或者说是从一个对象来获取到其路径的这么一个过程,就叫做反向解析.反向解析在Django里面最大的便利在于我们会给url起一个别名,然后通过这个别名来获取路径,这样不管我们url后缀怎么改变,其余的代码都不用随之发生变化.
- 这里要注意的一点是,我们在给url起别名的时候,前面应该加上自己的应用名,这样在和别人合作完成一个比较大的项目的时候才不会出现函数冲突的情况
反向解析一般在三个地方会使用,即平时固定网址使用,或者在有名分组以及无名分组里面使用.
无分组的反向解析
首先,反向解析的前提是我们要在urls.py里面的url里定义name属性
# 比如我们给编辑页面起别名为app01_edit
# urls.py
url(r'^edit_user/', views.edit_user, name='app01_edit')
# 那么我们需要在前端,也就是html页面里面这么写
# edit_uset.html
<a href="{% url 'app01_edit' %}">111</a>
# 然后,我们需要在后端,也就是views.py里面写
from django.shortcuts import reverse
url = reverse('app01_edit')
# 这样可以直接解析出来一个对象,此时反向解析全部完成
无名分组的反向解析
# 和无分组有一定的区别
# 无名分组的反向解析
# urls.py
url(r'^edit_user/(\d+)/', views.edit_user, name='app01_edit')
# 那么我们需要在前端,也就是html页面里面这么写
# edit_uset.html
<a href="{% url 'app01_edit' user_obj.pk %}">111</a>
# user_obj.pk 会取到该对象的主键
# 然后,我们需要在后端,也就是views.py里面写
from django.shortcuts import reverse
url = reverse('app01_edit',args=(1,))
有名分组的反向解析
# 有名分组的反向解析
# urls.py
url(r'^edit_user/(?P<year>\d+)/', views.edit_user, name='app01_edit')
# 那么我们需要在前端,也就是html页面里面这么写
# edit_uset.html
<a href="{% url 'app01_edit' user_obj.pk %}">111</a>
# 然后,我们需要在后端,也就是views.py里面写
from django.shortcuts import reverse
url = reverse('app01_edit',kwargs = {'key':1})
路由的分发
随着项目越来越大,我们的app数量也会随之增多,此时如果所有的url都写在项目主目录下的urls里,那么这个urls.py就会十分庞大,而且工总量也很大,同时不便于管理,结构也不清晰,所以我们提出了路由分发这么一个概念,即每个app都会有自己的urls.py,有自己的static,templates文件夹,这样每个app都可以实现自己的功能,且完全不会影响其他的app,所以我们项目下的urls.py只需要作为一个中转站即可,只负责将请求分发到不同的app中,然后由app中的urls.py完成路由与视图函数的对应关系.
这里我们有一种非常简单的执行方法
# /urls.py
urlpatterns = [
url(r'^app01/',include('app01.urls')),
url(r'^app02/',include('app02.urls'))
]
# 这样我们就可以把需要app01执行的请求转发给app01,需要app02执行的请求转发给app02
Django的日常-路由层的更多相关文章
- Django day05 虚拟环境 django 2.0和django 1.0 路由层区别
一:虚拟环境 创建虚拟环境一般有三种方式: 1) File--->New Project--> 出现如下图,点击Project Interpreter:New Virtualenv e ...
- Django的日常-模型层(2)
目录 Django的日常-模型层(2) 几种常用的查询方式 聚合查询 分组查询 F和Q查询 查询优化相关 orm中常见字段 choices参数 orm的事务操作 Django的日常-模型层(2) 几种 ...
- Django的日常-模型层(1)
目录 Django的日常-模型层(1) 模型层 django测试环境 ORM查询 Django的日常-模型层(1) 模型层 模型层其实就是我们应用名下的models.py文件,我们在里面写入想要创建的 ...
- [Django框架之路由层匹配、有名 无名分组、反向解析、路由分发、名称空间、伪静态、本地虚拟环境、django版本区别]
[Django框架之路由层匹配.有名 无名分组.反向解析.路由分发.名称空间.伪静态.本地虚拟环境.django版本区别] 路由层 路由即请求地址与视图函数的映射关系,如果把网站比喻成一本书,那路由就 ...
- day05 django框架之路由层
day05 django框架之路由层 今日内容概要 简易版django请求声明周期流程图(重要) 路由匹配 无名有名分组 反向解析 无名有名解析 路由分发 名称空间 伪静态 虚拟环境 简易版djang ...
- Django 学习 之路由层(URL)
路由层(URL) 1.路由层简单配置 (1)path方法 写固定的url. (2)re_path方法 可以正则规则 例: urlpatterns = [ path('admin/', admin.si ...
- Django学习之路由层
Django请求生命周期 - wsgi, 他就是socket服务端,用于接收用户请求并将请求进行初次封装,然后将请求交给web框架(Flask.Django) - 中间件,帮助我们对请求进行校验或在请 ...
- Django( 学习第三部 Django的url路由层)
目录 url路由层 路由匹配(有名分组与无名分组) 反向解析 路由分发 名称空间(了解) Django版本区别 url 路由匹配 注意事项: url方法,第一个参数是正则表达式,只要第一个参数能够匹配 ...
- Django框架之路由层汇总
一 Django中路由的作用 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于客户端发来 ...
随机推荐
- 关于RSA加密和签名的区别与联系
发现网上对于RSA加密和签名的介绍普遍偏向于使用和概念的说明,今天想说一点不一样的.对于加解密和签名的使用及概念就不再说了,不知道的请自行百度. 签名的本质其实就是加密,但是由于签名无需还原成明文,因 ...
- ionic js 侧栏菜单 把主要内容区域从一边拖动到另一边,来让左侧或右侧的侧栏菜单进行切换
ionic 侧栏菜单 一个容器元素包含侧边菜单和主要内容.通过把主要内容区域从一边拖动到另一边,来让左侧或右侧的侧栏菜单进行切换. 效果图如下所示: 用法 要使用侧栏菜单,添加一个父元素<ion ...
- js数组方法 slice()和splice()
说实在我之前都不怎么分的清这个两个函数,因为这两个函数名字那么像,经常我就弄混了,平常使用的时候都先查一下我需要使用的实际是哪个函数.这样不说很浪费时间,但是也是影响了开发效率,所以我决定今天就彻底区 ...
- Benchmark of Large-scale Unconstrained Face Recognition-blufr 算法的理解
Many efforts have been made in recent years to tackle the unconstrained face recognition challenge. ...
- 利用DNSQuery 进行DNS查询
#include <WinSock2.h> #include <WinDNS.h> #pragma comment (lib, "Dnsapi.lib") ...
- leetcode-227-基本计算器②
题目描述: 方法一:中缀转后缀 #!_*_coding:utf-8_*_ class Solution: def calculate(self, s: str) -> int: def in_t ...
- 关于SecureCRT不能显示输入、换行不正常
网上绿色破解版的SecureCRT会碰到这种问题,即输入字符不显示在终端.换行后下一行的行首有很大一段退格: 如上,输入的指令不显示:回车后下一行的起始位置不对. 碰到这种问题,在波特率.奇偶校验.停 ...
- SQL Server 添加数据库没有权限等
{ 在安装好sql 后 第一次需要用windows 方式登陆 1.创建一个宁外一个登陆名登陆 在安全->登陆名 2.给此登陆属性的服务器角色添加sysadmin权限 //尽情享受!!! }
- luoguP1062 数列 [数学]
题目描述 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是: 1,3,4,9,10,12,13,… (该序列实际上就是 ...
- poj 1742 Coins(二进制优化多重背包)
传送门 解题思路 多重背包,二进制优化.就是把每个物品拆分成一堆连续的\(2\)的幂加起来的形式,然后把最后剩下的也当成一个元素.直接类似\(0/1\)背包的跑就行了,时间复杂度\(O(nmlogc) ...