[Django框架之路由层匹配、有名 无名分组、反向解析、路由分发、名称空间、伪静态、本地虚拟环境、django版本区别]
[Django框架之路由层匹配、有名 无名分组、反向解析、路由分发、名称空间、伪静态、本地虚拟环境、django版本区别]
路由层
路由即请求地址与视图函数的映射关系,如果把网站比喻成一本书,那路由就是这本书的目录,在django中默认把路由配置在urls.py中
路由配置
# urls.py
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r^test/[0-9]{4})/$,views.test # 数字组加量字的组合(限制四位数)
url(r'^test/(\d+)/$',views.test), # 无名分组:数字贪婪匹配
url(r'^testadd/(?P<id>\d+)/$',views.testadd), # 有名分组
url(r'^test2/(\d+)/(\d+)/$',views.test2), # 无名分组多个
url(r'^test2/(?P<id>\d+)/(?P<id1>\d+)/$',views.test2) # 有名分组多个
]
路由的简单配置示例
#urls.py
from django.conf.urls import url
from django.contrib import admin
from app01 import views # 导入模块views.py
"""
由一条条映射关系组成的urlpatterns列表称之为路由表
url()方法
^xxxx/$ :第一个参数其实是正则表达式,用来匹配url地址的路径部分
view.xxxx :一旦第一个参数匹配到了内容则直接结束匹配,执行对应的视图函数,
来处理业务逻辑
"""
urlpatterns= [
url(r'^admin/',admin.site.urls),
# 写我们自己的路由与视图函数对应关系
url(r'^index/$',views.index) # 新增一条
]
#views.py
from django.shortcuts import render,HttpResponse
def index(request):
return HttpResponse('holle word')
# settings.py
# APPEND_SLASH = False # 控制是否加斜杠再次请求
# 改参数默认就是True 一般情况下无需修改
注意:用上面这个示例运行djongo项目,在浏览器中输入http://127.0.01:8080/index/会看到hello word,因为r'^index/$'正则表达式匹配成功了,但是在浏览器中输入http://127.0.01:8080/index,理应不会匹配成功任何正则表达式,但是还是会看到hello word因为在配置文件settings.py中有一个默认参数APPEND_SLASH,该参数有两个值(True或False,如果没有设置就默认为True),当为True时 ,Django会在路径后面自动加上/,再去匹配\
路由匹配规律
先不加/匹配一次,如果匹配不上,浏览器进行重定向,自动加一个/再匹配一次,如果还匹配不上就会报错
无名分组:
执行视图函数的时候会将分组(括号)内正则表达式匹配到的内容当做位置参数传递给对应的视图函数,视图函数加一个形参接收,再通过reverse进行反向解析得完整的请求地址,这样就可以知道用户访问的是什么资源,进行针对性返回
# 路由urls.py
url(r'^test/\d+/$',views.test)
# 正则表达式分组:给正则表达式前后加一个小括号
url(r'^test/(\d+)/$',views.test)
# 视图views.py
def test(request,xxx):
print(xxx)
return HttpResponse('from test')
有名分组
执行视图函数的时候会将分组(括号)内正则表达式匹配到的内容当做关键字参数传递给对应的视图函数
# 路由
url(r'^testadd/(?P<id>\d+)/$',views.testadd) # 给正则表达式起个别名
# 视图
def test(request,id):
print(id)
return HttpResponse('from testadd')
是否可以结合使用
利用有名分组和无名分组 我们就可以在调用视图函数之前给函数传递额外的参数
注意:无名分组和有名分组不能混合使用
但是同一种分组的情况下可以使用多次,
无名可以有多个
有名可以有多个
# 第一个是无名,第二个是有名
url(r'^test1/(\d+)/(?P<id>\d+)/$',views.test1) # 报错,不能混用
# 可以无名分组多个使用
url(r'^test2/(\d+)/(\d+)/$',views.test2),
# 可以有名分组多个使用
url(r'^test2/(?P<id>\d+)/(?P<id1>\d+)/$',views.test2)
反向解析
当路由频繁变化的时候,html界面上的连接地址如何做到动态解析?
根据自己设置的一个别名,动态解析出一个结果,该结果可以直接访问对应的url
"""
通过别名反向解析到一个结果
该结果可以访问到对应的视图函数
"""
1.给路由与视图函数对应关系添加一个别名(名字自己指定 只要不冲突即可)
# 路由
url(r'^index/',views.index,name='index_name')
2.根据该别名动态解析出一个结果,该结果可以直接访问到对应的路由
# 前端模板文件中使用
<a href="{% url 'index_name' %}">111</a>
# 后端视图函数中使用
from django.shortcuts import render, HttpResponse, redirect, reverse
# 需要导一个反向解析模块
def func(request):
# 第一种
_url = reverse('index_name')
print(_url)
# return redirect('/index/')
# 第二种
return redirect('index_name') # 还可以直接写别名
ps:redirect括号内也可以直接写别名
无名分组反向解析
当路由出现无名有名分组反向解析需要传递额外的参数
# 路由
url(r'^index/(\d+)/',views.index,name='index_name')
# 前端模板文件中使用
<a href="{% url 'index_name' 1 %}"></a>
# 只要给个数字即可、但通常为主键值
# 后端视图函数中使用
reverse('index_name',args=(1,)) # 只要给个数字即可
有名分组反向解析
# 路由
url(r'^index/(?P<id>\d+)/',views.index,name='index_name')
# 前端模板文件中使用
<a href="{% url 'index_name' id=666 %}"></a>
# 只要给个数字即可、但通常为主键值 例如 user_id = 主键值
# 后端视图函数中使用
reverse('index_name',kwargs={'id':123}) # 只要给个数字即可
总结
针对无名分组有名分组都可以使用一种(无名)反向解析的形式
反向解析的本质: 就是获取到一个能够访问名字所对应的视图函数
路由分发
简介
django是专注于开发应用的,当一个django项目特别庞大的时候,所有的路由与视图函数映射关系全部写在项目名下urls.py(总路由层),很明显太冗余也不便于管理
其实在django中的每一个(app)应用都可以有自己独立的urls.py路由层,static文件夹,templates文件夹。
基于上述特点,使用django做分组开发非常的简便。每个人只需要写自己的应用即可,互不干扰。最后由组长统一汇总到一个空的django项目中然后使用路由分发将多个应用关联到一起,即可完成大项目的拼接
- 路由分发解决的就是项目的总路由匹配关系过多的情况
- 使用路由分发 会将总路由不再做匹配的活
- 而仅仅是做任务分发(请求来了之后 总路由不做对应关系 只询问你要访问哪个app的功能 然后将请求转发给对应的app去处理 )
1.路由分发,复杂版本
# 需要导入一个include模块
from django.conf.urls import url,include
# 导入子路由的uls
from app01 import urls as app01_urls
from app02 import urls as app02_urls
# 路由分发,复杂版本
url(r'^app01/',include(app01_urls))
url(r'^app02/',include(app02_urls))
'''总路由最后千万不能加$'''
2.路由分发,进阶版本
from django.conf.urls import url,include
url(r'^app01/',include('app01.urls')),
url(r'^app02/',include('app02.urls'))
'''总路由最后千万不能加$'''
# app01.urls就相当于于from app01 import urls as app01_urls
名称空间
"""
当多个应用在反向解析的时候如果出现了别名冲突的情况,那么无法自动识别
"""
解决方式1>>>:名称空间
总路由 # 指定名称空间名字namespace
url(r'^app01/',include('app01.urls',namespace='app01'))
url(r'^app02/',include('app02.urls',namespace='app02'))
#后端就会 显示哪个子应用下的index_name
reverse('app01:index_name')
reverse('app02:index_name')
#前端
<a href="{% url 'app01:index_name' %}">app01</a>
<a href="{% url 'app02:index_name' %}">app02</a>
解决方式2>>>:别名不能冲突(加上自己应用名作为前缀) 例如:app01_index_name
url(r'^index/',views.index,name='app01_index_name')
url(r'^index/',views.index,name='app02_index_name')
伪静态
原来是动态页面/login 做成/login.html
将url地址模拟成html结尾的样子,看上去像是一个静态文件
目的是为了增加搜索引擎收藏我们网站的概率以及seo查询几率
ps:再怎么优化都不如RMB玩家!!!
本地虚拟环境
在实际的开发过程中,我们会给不同的项目配备不同的环境,项目用到什么就装什,用不到的一概不装,不同的项目解释器环境都不一样
- 创建虚拟环境类似于你重新下载了一个纯净的python解释器
- 如果反复创建类似于反复下载,会消耗一定的硬盘空间
ps:我们目前不推荐你使用虚拟环境,所有的模块统一全部下载到本地
了解知识:项目依赖 requirements.txt
python语言算是比较早提出包管理概念的, 使用pip安装依赖的确是非常方便. 对于一些简单的脚本或爬虫, 我们一般直接使用
系统python环境安装相关依赖. 稍微大一点的项目, 比如使用了Django, 那么所需要的依赖就非常多, 这个时候使用venv隔离
环境就非常好(建议python项目多使用venv环境). 但我们的问题是, 当我们将项目移到另一个环境中时, 这些依赖怎么安装,
还是一个一个去对比执行?
解决方法:
1. 导出原项目的依赖
pip freeze > requirements.txt
2. 在新项目中一次性安装依赖
pip install -r requirements.txt
在pycharm窗口选择file----->settings
选择Project Interpreter----->设置按钮选择Add
根据自身需求进行选项,最好将虚拟环境放在指定的文件夹内,方便后面的项目使用
在虚拟环境下创建新的django项目需要注意的:
django版本区别
django1.X与2.X、3.X之间路由的区别
urls.py中的路由匹配方法:
1.X第一个参数正则表达式
url()
2.X和3.X第一个参数不支持正则表达式,写什么就匹配什么,100%精准匹配
path()
如果想要使用正则,那么2.X与3.X也有响应的方法
from django.urls import path,re_path
re_path 等价于 1.X里面的url方法
虽然django1.X与2.X里面的path不支持正则表达式,但是它提供五个默认的转换器
str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
int,匹配正整数,包含0。
slug,匹配字母、数字以及横杠、下划线组成的字符串。
uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)
自定义转换器(了解):
class MonthConverter:
regex='\d{2}' # 属性名必须为regex
def to_python(self, value):
return int(value)
def to_url(self, value):
return value # 匹配的regex是两个数字,返回的结果也必须是两个数字
from django.urls import path,register_converter
from app01.path_converts import MonthConverter
register_converter(MonthConverter,'mon')
from app01 import views
urlpatterns = [
path('articles/<int:year>/<mon:month>/<slug:other>/', views.article_detail, name='aaa'),
]
[Django框架之路由层匹配、有名 无名分组、反向解析、路由分发、名称空间、伪静态、本地虚拟环境、django版本区别]的更多相关文章
- Django框架之第三篇(路由层)--有名/无名分组、反向解析、路由分发、名称空间、伪静态
一.Django请求生命周期 二.路由层 urls.py url()方法 第一个参数其实就是一个正则表达式,一旦前面的正则匹配到了内容,就不会再往下继续匹配,而是直接执行对应的视图函数. djang ...
- Django框架(四)—— 路由控制:有名/无名分组、反向解析、路由分发、名称空间、伪静态、APPEND_SLASH、不同版本的Django区别
目录 路由控制 一.简单路由配置 二.无名分组 三.有名分组 四.反向解析 五.路由分发 六.名称空间(一般不使用) 七.伪静态 八.Django 2.x和Django 1.x 路由层区别 九.APP ...
- Django框架(四)-- 路由控制:有名/无名分组、反向解析、路由分发、名称空间、伪静态、APPEND_SLASH、不同版本的Django区别、Django虚拟环境搭建
路由控制 一.简单路由配置 url(r'^booklist$', views.booklist) 第一个参数是正则表达式,第二个参数是视图函数 每个正则表达式前面的'r' 是可选的但是建议加上.它告诉 ...
- django之路由分组,反向解析,有名,无名分组
路由层 无名分组 有名分组 反向解析 路由分发 名称空间 伪静态的概念 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'test',vi ...
- 一、数据库表中字段的增删改查,二、路由基础.三、有名无名分组.四、多app共存的路由分配.五、多app共存时模板冲突问题.六、创建app流程.七、路由分发.八、路由别名,九、名称空间.十、反向解析.十一、2.x新特性.十二、自定义转换器
一.数据库表中字段的增删改查 ''' 直接在modules中对字段进行增删改查 然后在tools下点击Run manage.py Task执行makemigrations和migrate 注意在执行字 ...
- Django学习——路由层之路由匹配、无名分组、有名分组、反向解析
路由层之路由匹配 """路由你可以看成就是出去ip和port之后的地址""" url()方法 1.第一个参数其实是一个正则表达式 2.一旦第 ...
- 第三百零四节,Django框架,urls.py模块,views.py模块,路由映射与路由分发以及逻辑处理——url控制器
Django框架,urls.py模块,views.py模块,路由映射与路由分发以及逻辑处理——url控制器 这一节主讲url控制器 一.urls.py模块 这个模块是配置路由映射的模块,当用户访问一个 ...
- 二 Django框架,urls.py模块,views.py模块,路由映射与路由分发以及逻辑处理——url控制器
Django框架,urls.py模块,views.py模块,路由映射与路由分发以及逻辑处理——url控制器 这一节主讲url控制器 一.urls.py模块 这个模块是配置路由映射的模块,当用户访问一个 ...
- Django框架04 /模板相关、别名/反向解析/路由分发
Django框架04 /模板相关.别名/反向解析/路由分发 目录 Django框架04 /模板相关.别名/反向解析/路由分发 1. 语法 2. 变量/万能的点 3 . 过滤器 4. 标签Tags 5. ...
随机推荐
- time模块&datetime模块
import time a=time.localtime(time.time()) #将时间戳转换为当前时区的元组 print(a) c=time.gmtime(time.time()) #把时间戳转 ...
- 获取执行计划之Autotrace
Autotrace 简介 AUTOTRACE是一项SQL*Plus功能,自动跟踪为SQL语句生成一个执行计划并且提供与该语句的处理有关的统计. AUTOTRACE的好处是您不必设置跟踪文件的格式,并且 ...
- 「HTML+CSS」--自定义加载动画【005】
前言 Hello!小伙伴! 首先非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出- 哈哈 自我介绍一下 昵称:海轰 标签:程序猿一只|C++选手|学生 简介:因C语言结识编程,随后转入计算机 ...
- Qt信号槽源码剖析(一)
大家好,我是IT文艺男,来自一线大厂的一线程序员 大家在使用Qt开发程序时,都知道怎么使用Qt的信号槽,但是Qt信号槽是怎么工作的? 大部分人仍然不知道:也就是说大家只知道怎么使用,却不知道基于什么原 ...
- Spring Cloud Alibaba(2)---Nacos概述
Spring Cloud Alibaba(2)---nacos概述 上一篇博客讲了有关 SpringCloudAlibaba的概述,这篇开始讲SpringCloudAlibaba组件之一---Naco ...
- Spring MVC(七篇)
(一)Spring MVC简介 (二)SpringMVC核心控制器 (三)Spring MVC Controller接口控制器详解(一) (三)Spring MVC Controller接口控制器详解 ...
- 吃透什么是KVM虚拟化
概念: 云计算自从提出,一直没有一个明确而统一的定义.维基百科对云计算做了如下的描述:云计算是一种通过因特网以服务的方式提供动态可伸缩的虚拟化的资源的计算模式.美国国家标准与技术研究院( NIST)定 ...
- 阿里巴巴面试-Java后端-社招5面技术总结(Offer已拿)
最近接到阿里妈妈的面试通知,历经一个月,虽然过程挺坎坷,但总算是拿到了offer.这里简单记录下面试所遇问题,仅供各位大佬参考. 由于前面两面的时间过去的有点久了,只能根据记忆大概写些记得问题. 部门 ...
- 使用Viper读取Nacos配置(开源)
使用Viper读取Nacos配置(开源) 一.前言 目前Viper支持的Remote远程读取配置如 etcd, consul:目前还没有对Nacos进行支持,本文中将开源一个Nacos的Viper支持 ...
- 华为USG6000V防火墙简单配置案例
如图,PC1是企业内网用户,要通过防火墙NAT方式( 1.1.1.105-1.1.1.106 )访问Internet,Server是企业的FTP服务器,通过静态NAT方式供外网用户访问,对外的地址是1 ...