day05 django框架之路由层
day05 django框架之路由层
今日内容概要
- 简易版django请求声明周期流程图(重要)
- 路由匹配
- 无名有名分组
- 反向解析
- 无名有名解析
- 路由分发
- 名称空间
- 伪静态
- 虚拟环境
简易版django请求声明周期流程图(重要)
路由匹配
# 路由匹配
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'test', views.test),
url(r'testadd', views.testadd),
] # 所以页面输出的永远都是test对应的视图函数
urlpatterns = [
url(r'^admin/', admin.site.urls),
# 首页
url(r'^$', views.home)
# 路由匹配
url(r'^test/$', views.test), # 不建议使用$符号,因为可能后面还会跟一些参数
url(r'^testadd', views.testadd),
# 尾页
url(r'',views.error)
]
特性1:
'''
url方法第一参数是正则表达式
只要第一个参数正则表达式能够匹配到内容,那么就会停止匹配,执行对应的视图函数
'''
特性2:
'''
在输入url的时候会默认输出斜杠?
是django内部做的重定向
第一次匹配不行,url后面加斜杠再来一次
'''
# 取消django默认加斜杠,修改settins.py文件,添加:
APPEND_SLASH = False
无名分组
分组:就把是正则表达式用小括号括起来
# 无名分组:
url(r'^test/(\d+)/', views.test), # \d+ :配置到1个或者多个数字
def test(request,*args,**kwargs):
print(args,kwargs) # ('1314',)
return HttpResponse('test')
# 总结:无名分组就是将括号内正则表达式匹配到的内容当做位置参数传递给后面的视图函数
# 会以元祖的方式传递过来
# 验证无名分组和有名分组可以混用吗?
答:不能混用
url(r'^index/(\d+)/(?P<xxx>\d+)/',views.index)
# 单个分组可以使用多次
url(r'^test/(\d+)/(\d+)/(\d+)',views.test)
url(r'^index/(?P<yyy>\d+)/(?P<xxx>\d+)/',views.index)
有名分组
有名分组:可以给正则表达式起一个别名
# 有名分组:
url(r'^test/(?P<year>\d+)/',views.test) # ?P<year> :给\d+ 起了个别名叫做year
def test(request,*args,**kwargs):
print(args,kwargs) # {'year': '1314'}
return HttpResponse('test')
# 总结:无名分组就是将括号内正则表达式匹配到的内容当做关键字参数传递给后面的视图函数
# 会以字典的方式传递过来
反向解析
反向解析:通过一些方法得到一个结果,该结果可以访问到对应url从而触发视图函数的运行
# 域名解析:相当于起了一个别名。 name='唯一标识'
# 如果产品经理叫你改url后缀名,但是一改会有许多网址失效,这时候就用到name起别名了
# 动态获取修改的别名和url的是一样的
1、在路由层书写正则与函数名的时候 在后面加一个唯一标识
url(r'^func/',views.func,name='my_func')
2、前端反向解析
{% url 'my_func' %}
3、后端反向解析
# url(r'^funcddd/',views.func,name='my_func') 修改后
from django.shortcuts import reverse # 用reverse模块可以在后端实时跳转到url
print(reverse('my_func'))
http://127.0.0.1:8000/funcddd/
"""
通过标记解析出一个结果 该结果可以访问到标记所在的那一行地址
无论怎么后缀名怎么改,都可以实时获取后缀名,从而进入到对应的视图函数
"""
无名有名分组反向解析
# 无名分组反向解析
url(r'^func/(\d+)/',views.func,name='my_func')
print(reverse('my_func')) # 报错,除了反向解析,还需要一个参数,而且必须让正则匹配上
后端:
def home(request):
print(reverse('my_func', args=(10,))) # 需要一个参数才能匹配上
return render(request,'home.html')
def func(request,*args): # 加上无名分组需要一个参数接收
return HttpResponse('func')
前端:
<a href="{% url 'my_func' 1 %}">111</a>
# 这个数字写代码的时候应该放什么?
数字一般情况下放的是数值的主键值,一般用作数据的编辑和修改
有名分组反向解析
# 有名分组反向解析
url(r'^index/(?P<year>\d+)',views.index,name='my_index')
后端:
def home(request):
# 有名分组反向解析
print(reverse('my_index',kwargs={'year':123}))
return render(request,'home.html')
def index(request,year):
return HttpResponse('index')
前端:
<a href="{% url 'my_index' year=8 %}">111</a>
# 简单写法:推荐使用这种方法
print(reverse('my_index', args=(10,)))
<a href="{% url 'my_index' 111 %}">111</a>
"""其实无名有名反向解析可以使用通用的方式"""
都可以使用无名分组的反向解析
路由分发
当django项目特别庞大的时候 如果所有的路由匹配都写在项目的总路由中会导致总路由过于复杂不利于维护 此时可以将路由做拆分
"""
django支持所有的应用都可以拥有自己的
urls.py
templates文件夹
static文件夹
也就意味着多人协同开发变得更加的简单了
"""
如何将多个单独的app组织到一起 >>> 路由分发
'''
利用路由分发之后,总路由不再路由与视图函数的直接对应关系
而是做一个分发处理
识别当前url是哪个应用下的,直接分发给对应的应用去处理
'''
# 总路由:include
总路由
from app01 import urls as app01_urls # 当名字冲突了,用起别名的方式解决
from app02 import urls as app02_urls
from django.conf.urls import url,include
# 路由分发
url(r'^app01/',include(app01_urls)), # 只要url前缀是app01开头,全部交给app01处理
url(r'^app02/',include(app02_urls)), # 只要url前缀是app02开头,全部交给app02处理
子路由
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'^index/',views.index)
]
子路由
from django.conf.urls import url
from app02 import views
urlpatterns = [
url(r'^index/',views.index)
]
# 更加简便的写法
url(r'^app01/',include('app01.urls')),
url(r'^app02/',include('app02.urls')),
# 总路由中不能加$,不然匹配不上后面的。
名称空间(了解)
# 当多个app中出现了相同的别名 那么使用反向解析无法自动识别
# 使用名称空间namespace,会自动识别
总路由
# 名称空间
url(r'^app01/',include('app01.urls',namespace='app01')),
url(r'^app02/',include('app02.urls',namespace='app02')),
子路由
# app01
urlpatterns = [
url(r'^reg/',views.reg,name='reg')
]
# app02
urlpatterns = [
url(r'^reg/',views.reg,name='reg')
]
反向解析
reverse('app01:reg') # 会自动弹出名称空间里的反向解析
reverse('app02:reg')
{% url 'app01:reg' %}
{% url 'app02:reg' %}
"""
名称空间其实也可以不用 只需要确保不同的app下别名不冲突即可
如何不冲突
一般情况下,有多个app的时候我们在起别名的时候会加上app的前缀
这样的话就能确保多个app之间名字不冲突的问题
可以在起别名的时候加上应用名前缀
app01_my_index
app02_my_index
"""
urlpatterns = [
url(r'^reg/',views.reg,name='app01_reg') # 加上前缀
]
urlpatterns = [
url(r'^reg/',views.reg,name='app02_reg')
]
伪静态(了解)
静态页面
数据写死的 不怎么改变的
伪静态页面
看似是文件其实是动态网页 这么做事为了提高网站被搜索引擎收录的概率
将路径后缀改为.html形式即可
为什么要伪装?
伪装的目的在于增大本网站的seo查询力度
并且增加搜索引擎收藏本网站的概率
# 怎么编程静态网页呢
urlpatterns = [
url(r'^reg.html/',views.reg,name='app01_reg') # 加上前缀
] # 在url后缀加上.html,但是一般不用。
虚拟环境(了解)
虚拟环境能够实现针对不同的项目配备专属的编程环境
创建虚拟环境相当于重新下载了一个新的解释器
# 但是虚拟环境不要下载太多,是需要消耗硬盘空间的
虚拟环境的唯一表示是venv文件夹
day05 django框架之路由层的更多相关文章
- [Django框架之路由层匹配、有名 无名分组、反向解析、路由分发、名称空间、伪静态、本地虚拟环境、django版本区别]
[Django框架之路由层匹配.有名 无名分组.反向解析.路由分发.名称空间.伪静态.本地虚拟环境.django版本区别] 路由层 路由即请求地址与视图函数的映射关系,如果把网站比喻成一本书,那路由就 ...
- Django框架之路由层汇总
一 Django中路由的作用 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于客户端发来 ...
- Django day05 虚拟环境 django 2.0和django 1.0 路由层区别
一:虚拟环境 创建虚拟环境一般有三种方式: 1) File--->New Project--> 出现如下图,点击Project Interpreter:New Virtualenv e ...
- 3/19 Django框架 url路由配置及模板渲染
3/19 Django框架 url路由配置及模板渲染 1.路由分配 URL(Uniform Resoure Locato):统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示, ...
- Django的日常-路由层
目录 Django的日常-2 路由层 有名分组和无名分组 反向解析 路由的分发 Django的日常-2 路由层 我们之前已经接触过路由层,只是我们可能不知道他叫这个名字,实际上在Django里面路由层 ...
- Django学习之路由层
Django请求生命周期 - wsgi, 他就是socket服务端,用于接收用户请求并将请求进行初次封装,然后将请求交给web框架(Flask.Django) - 中间件,帮助我们对请求进行校验或在请 ...
- Django 学习 之路由层(URL)
路由层(URL) 1.路由层简单配置 (1)path方法 写固定的url. (2)re_path方法 可以正则规则 例: urlpatterns = [ path('admin/', admin.si ...
- Django( 学习第三部 Django的url路由层)
目录 url路由层 路由匹配(有名分组与无名分组) 反向解析 路由分发 名称空间(了解) Django版本区别 url 路由匹配 注意事项: url方法,第一个参数是正则表达式,只要第一个参数能够匹配 ...
- Django框架简介-路由系统
2.2 路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. 你就是 ...
随机推荐
- Hadoop的安装与部署
一.硬件及环境 服务器:3台,IP分别为:192.168.100.105.192.168.100.110.192.168.100.115 操作系统:Ubuntu Server 18.04 JDK:1. ...
- bash执行顺序:alias --> function --> builtin --> program
linux bash的执行顺序如下所示: 先 alias --> function --> builtin --> program 后 验证过程: 1,在bash shell中有内置 ...
- HttpContext.Current.Request.Url 地址:获取域名
假设当前页完整地址是:http://www.test.com/aaa/bbb.aspx?id=5&name=kelli 协议名----http://域名 ---- www.test.com站 ...
- Bzoj P2054 疯狂的馒头 | 并查集
题目链接 思路:因为每次染色都会将某些馒头的颜色彻底更改,所以每个馒头的最终的颜色其实是由最后一次染色决定的,那么我们只考虑最后一次染色即可.对此,我们可以从后往前倒着染色,当目前的染色区间中存在白色 ...
- 谷歌chrome多个相同用户登陆同一个机器多开配置
创建快捷方式,目标中填写:路径+参数如下所示即可 参数:--user-data-dir=%LOCALAPPDATA%\Google\Chrome\%SessionName%
- pycharm安装指导教程
pycharm下载安装教程 1.pycharm下载官网 http://www.jetbrains.com/pycharm/ 2.下载好安装包后双击点开安装包文件,这边以专业版为例 按以上图片所示教程, ...
- 攻防世界 WEB 高手进阶区 NSCTF web2 Writeup
攻防世界 WEB 高手进阶区 NSCTF web2 Writeup 题目介绍 题目考点 php基本函数语法 加密解密函数 base64_decode().str_rot13() 字符串反转函数 str ...
- 剑指 Offer 20. 表示数值的字符串
方法:分为几个部分判断 DA[.B][E/eC] D 其中D表示前后的空格,需要处理,跳过即可 A可以带正负号 有符号数 B无符号数 C可以为有符号数(带+-号) 小数点.后面必须是无符号数或者没有 ...
- Django笔记&教程 3-4 模板继承
Django 自学笔记兼学习教程第3章第4节--模板继承 点击查看教程总目录 在介绍具体的技术之前,先介绍在什么样的场景中,需要使用这样的技术,我觉得这对于新手理解起来很重要. 一般来说,要渲染一个页 ...
- Python科普系列——类与方法(下篇)
书接上回,继续来讲讲关于类及其方法的一些冷知识和烫知识.本篇将重点讲讲类中的另一个重要元素--方法,也和上篇一样用各种神奇的例子,从原理和机制的角度为你还原一个不一样的Python.在阅读本篇之前,推 ...