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调用的视图函数之间的映射表. 你就是 ...
随机推荐
- sed初理多行合并+sed之G、H、g、h使用+sed n/N使用说明
转载:[shell]sed处理多行合并 - seyjs - 博客园 (cnblogs.com) 文件格式 table=t1 name owner address table=t2 id text co ...
- Python matplotlib 概率论与数理统计 伯努利分布 二项分布
Python 代码实现 二项分布 import numpy as np import matplotlib.pyplot as plt import math from scipy import st ...
- Luogu P1196 [NOI2002]银河英雄传说 | 并查集
题目链接 并查集,具体看注释. #include<iostream> #include<cstdio> #include<cmath> using namespac ...
- hdu 2176 取(m堆)石子游戏 (裸Nim)
题意: m堆石头,每堆石头个数:a[1]....a[m]. 每次只能在一堆里取,至少取一个. 最后没石子取者负. 先取者负输出NO,先取胜胜输出YES,然后输出先取者第1次取子的所有方法.如果从有a个 ...
- js 实现边缘撞击检测动画
js 实现边缘撞击检测动画 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...
- LeetCode刷题 树专题
树专题 关于树的几个基本概念 1 树的节点定义 2 关于二叉树的遍历方法 2.1 前序遍历 2.2 中序遍历 2.3 后序遍历 2.4 层序遍历 3 几种常见的树介绍 3.1 完全二叉树 3.2 二叉 ...
- 3组-Alpha冲刺-3/6
一.基本情况 队名:发际线和我作队 组长博客:链接 小组人数:10 二.冲刺概况汇报 黄新成(组长) 过去两天完成了哪些任务 文字描述 使用labelimg工具对采集的数据进行标注,安装alphapo ...
- C#生成新浪微博短网址 示例源码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using DotN ...
- 论文解读(Line)《LINE: Large-scale Information Network Embedding》
论文题目:<LINE: Large-scale Information Network Embedding>发表时间: KDD 2015论文作者: Jian Tang, Meng Qu ...
- OpenCV常用操作函数大全
https://blog.csdn.net/Vici__/article/details/100714822 目录 cv2常用类: 1.图片加载.显示和保存 2.图像显示窗口创建与销毁 3.图片的常用 ...