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框架之路由层的更多相关文章

  1. [Django框架之路由层匹配、有名 无名分组、反向解析、路由分发、名称空间、伪静态、本地虚拟环境、django版本区别]

    [Django框架之路由层匹配.有名 无名分组.反向解析.路由分发.名称空间.伪静态.本地虚拟环境.django版本区别] 路由层 路由即请求地址与视图函数的映射关系,如果把网站比喻成一本书,那路由就 ...

  2. Django框架之路由层汇总

    一 Django中路由的作用 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于客户端发来 ...

  3. Django day05 虚拟环境 django 2.0和django 1.0 路由层区别

    一:虚拟环境 创建虚拟环境一般有三种方式: 1)   File--->New Project--> 出现如下图,点击Project Interpreter:New Virtualenv e ...

  4. 3/19 Django框架 url路由配置及模板渲染

    3/19 Django框架 url路由配置及模板渲染 1.路由分配 URL(Uniform Resoure Locato):统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示, ...

  5. Django的日常-路由层

    目录 Django的日常-2 路由层 有名分组和无名分组 反向解析 路由的分发 Django的日常-2 路由层 我们之前已经接触过路由层,只是我们可能不知道他叫这个名字,实际上在Django里面路由层 ...

  6. Django学习之路由层

    Django请求生命周期 - wsgi, 他就是socket服务端,用于接收用户请求并将请求进行初次封装,然后将请求交给web框架(Flask.Django) - 中间件,帮助我们对请求进行校验或在请 ...

  7. Django 学习 之路由层(URL)

    路由层(URL) 1.路由层简单配置 (1)path方法 写固定的url. (2)re_path方法 可以正则规则 例: urlpatterns = [ path('admin/', admin.si ...

  8. Django( 学习第三部 Django的url路由层)

    目录 url路由层 路由匹配(有名分组与无名分组) 反向解析 路由分发 名称空间(了解) Django版本区别 url 路由匹配 注意事项: url方法,第一个参数是正则表达式,只要第一个参数能够匹配 ...

  9. Django框架简介-路由系统

    2.2 路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. 你就是 ...

随机推荐

  1. VIVADO 2017.4配置MIG IP注意事项

    1.2GB的single rank SODIMMs配置pin还是和以前一样没有问题: 2.8GB SODIMMs配置pin需要注意4点: (1).所有的DDR3引脚都需要在连续的BANK上,例如Z71 ...

  2. 字符串压缩 牛客网 程序员面试金典 C++ Python

    字符串压缩 牛客网 程序员面试金典 C++ Python 题目描述 利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能.比如,字符串"aabcccccaaa"经压缩会变 ...

  3. JAVA笔记11__File类/File类作业/字节输出流、输入流/字符输出流、输入流/文件复制/转换流

    /** * File类:文件的创建.删除.重命名.得到路径.创建时间等,是唯一与文件本身有关的操作类 */ public class Main { public static void main(St ...

  4. Java项目中集成钉钉机器人推送消息提醒

    前言: 项目中有一个需求,当有新订单产生的时候,希望能够及时通知到业务相关人员进行处理,整体考虑了一下,选用了钉钉机器人提醒功能(公司内部主要也是使用钉钉进行通讯). 操作: 主要分为两部分进行处理: ...

  5. Qt Creator打造VScode one dark pro主题配色

    1.缘由 我之前习惯使用 vscode 进行开发,对 vscode 的 one dark pro 主题情有独钟.无奈公司需要使用 Qt Creator 进行日常开发,只能暂时舍弃 vscode,采用曲 ...

  6. 『学了就忘』Linux基础命令 — 30、find命令详细说明

    目录 1.find命令的基本信息 2.find命令基本使用 3.按照文件大小搜索 4.按照修改时间搜索 5.按照权限搜索 6.按照所有者和所属组搜索 7.按照文件类型搜索 8.逻辑运算符 (1)-a: ...

  7. win10 vscode安装babel

    第一步:安装 babel-cli cd进入项目根目录,执行命令: npm install --global babel-cli 第二步:检测第一步是否成功,输入命令 babel --version,若 ...

  8. NodeJs创建一个简单的服务器

    步骤: 1 //模块化引入 2 let http = require ("http"); 3 4 //创建服务器 5 http.createServer(function(requ ...

  9. 实验8:数据平面可编程实践——P4

    一.实验目的 掌握V1Model框架下P4_16的程序结构和基本语法 能够运用 P4 进行简单数据平面编程 二.实验报告 在修改basic_tunnel.p4的内容之后输入make run 验证创建结 ...

  10. Android——ViewHolder的作用与用法

    转载至:https://www.cnblogs.com/wugu-ren/p/6106379.htmlViewHolder通常出现在适配器里,为的是listview滚动的时候快速设置值,而不必每次都重 ...