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调用的视图函数之间的映射表. 你就是 ...
随机推荐
- Shadertoy 教程 Part 3 - 矩形和旋转
Note: This series blog was translated from Nathan Vaughn's Shaders Language Tutorial and has been au ...
- Java I/O框架 - 总结概述
总结 以下需要重点掌握: 字节流,以下读取结束全部返回-1 字节节点流-访问文件 FileInputStream/FileOutputStream 可以读取任意文件 可以复制图片 读取字符String ...
- Unity的Deferred Shading
什么是Deferred Shading Unity自身除了支持前向渲染之外,还支持延迟渲染.Unity的rendering path可以通过Edit/Project Settings中的Graphic ...
- eclipse javaEE版下载过程中选择镜像(Select Another Mirror)无反应解决办法,附带eclipse javaEE版下载教程。
1.eclipse javaEE版下载过程中选择镜像(Select Another Mirror)无反应 (复制该网址下载即可 https://mirrors.neusoft.edu.cn/eclip ...
- 《手把手教你》系列技巧篇(三十八)-java+ selenium自动化测试-日历时间控件-下篇(详解教程)
1.简介 理想很丰满现实很骨感,在应用selenium实现web自动化时,经常会遇到处理日期控件点击问题,手工很简单,可以一个个点击日期控件选择需要的日期,但自动化执行过程中,完全复制手工这样的操作就 ...
- MongoDB与MySQL效率对比
本文主要通过批量与非批量对比操作的方式介绍MongoDB的bulkWrite()方法的使用.顺带与关系型数据库MySQL进行对比,比较这两种不同类型数据库的效率.如果只是想学习bulkWrite()的 ...
- 事件消息生产消费中间件-OSS.DataFlow
系统重构解耦的过程涉及不同领域服务分拆,或同一服务下实时响应部分和非响应部分分拆,分解后的各部分通过异步消息的流转传递,完成整体的业务逻辑,但是频繁的在业务层面直接调用不同消息队列的SDK,个人感觉不 ...
- selenium截屏操作(也支持截长图)
1.常用的可能是谷歌和火狐做自动化在抛异常的时候可以截屏保存 from selenium import webdriver br=webdriver.Chrome() br.maximize_wind ...
- 设计系统(Design System),设计和开发之间的“DevOps”
最近,我们网站的上新增了几个新功能,比如通过导航栏的QR Code可以下载App:通过Carousel的方式,显示多条信息. 以往这样的功能可能需要2-3个Sprints完成,但是现在这些功能都是在一 ...
- Intellij IDEA 配置Junit
导包: 1.Hamcrest Core 包: https://mvnrepository.com/artifact/org.hamcrest/hamcrest-core/1.3 2.Junit包 ...