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调用的视图函数之间的映射表. 你就是 ...
随机推荐
- MySql各种文件及参数
MySql各种文件及参数 参数文件 MySql实例启动时,数据库会去读一个配置参数文件,用来寻找数据库的各种文件所在位置以及指定某些初始化参数,这些参数通常定义了内存结构有多大等信息. 数据库的参数可 ...
- let that = this用法解析
这种情况就是在一个代码片段里this有可能代表不同的对象,而编码者希望this代表最初的对象
- git push超过100M文件处理方法
git push超过100M文件处理方法 github 会在你上传文件大于50M的时候,给予警告 ; 大于100M的时候给出 server reject(拒绝上传) 解决方法 保持单个文件在 100 ...
- 截取oracle字符串中的数字
方法一:如果Oracle版本不是太低的话,使用 正则表达式函数 REGEXP_SUBSTR 处理. REGEXP_SUBSTR有5个参数,分别是: 第一个是输入的字符串 第二个是正则表达式 第三个是标 ...
- SpringCloud微服务实战——搭建企业级开发框架(十六):集成Sentinel高可用流量管理框架【自定义返回消息】
Sentinel限流之后,默认的响应消息为Blocked by Sentinel (flow limiting),对于系统整体功能提示来说并不统一,参考我们前面设置的统一响应及异常处理方式,返回相同的 ...
- [bzoj2241]打地鼠
先考虑如何判定一个r*c的矩阵是否符合条件,容易发现左上角的点无法被别的矩阵砸到,要求左上角r*c的矩阵中不能超过最左上角的元素,之后同理不断枚举最上&最左的非0点,可以用差分来优化,复杂度为 ...
- Java8-JVM内存区域划分白话解读
前言 java作为一款能够自动管理内存的语言,与传统的c/c++语言相比有着自己独特的优势.虽然我们无需去管理内存,但为了防范可能发生的异常,我们需要对java内部数据如何存储有一定了解,已应对突发问 ...
- cube+FreeRTOS联合开发采坑笔记
加了看门狗之后不断重启的可能 原因: 任务容量分配不足,在"FreeRTOSConfig.h"的配置中,有个configTOTAL_HEAP_SIZE中将堆大小调到最大.
- Spring Cloud Gateway过滤器精确控制异常返回(分析篇)
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 在<Spring Cloud Gate ...
- 【Spring】(1)-- 概述
Spring框架 -- 概述 2019-07-07 22:40:42 by冲冲 1. Spring的概念 ① Spring框架的关键词:开源框架.轻量级框架.JavaEE/J2EE开发框架.企业级 ...