51.1 Django 路由层(urls)
1.Django 请求周期流程图
2.路由匹配
urls正则匹配
解释1: 正则一般写法re.findall('ab','ab1 a a-b aaaaab') 只能拿到['ab']
那么django是如何匹配的 url(r'test',views.test) 如果前端url :http://127.0.0.1:8000/testadd
只要正则表达式r'test' 能从'testadd'匹配到结果,就让你访问对应的视图函数
解释2:正则结尾为什么要加‘/’ ,前端使用url :http://127.0.0.1:8000/testadd 访问时,Django会自动加‘/’ ,用户体验好
你可以在配置文件setting中指定是否开启该功能 APPEND_SLASH = True/False
解释3:首页: 空正则表达式,r'^$' 一般路由: 写死正则r'^test/$' 不存在的url 那就在最后使用空正则r''匹配 返回一个404页面
3.有名分组无名分组 (获取前端参数传给视图函数)
无名分组:
在路由匹配的时候给某段正则表达式加括号
前端匹配的时候会将括号内匹配到的内容当成位置参数传给视图函数
url(r'^test/([0-9]{4})/',views.test) # 视图函数 def index(request,args): return HttpResponse('')
有名分组: (?p<year>\d+)
给正则表达式起别名
前端匹配的时候会将括号内匹配到的内容当成关键字参数传给视图函数
# 有名分组 url(r'^test/(?P<year>\d+)/',views.test) # 视图函数 def index(request,year): ...
有名分组和无名分组不能混合使用
4.反向解析(根据名字访问到相应的url)
a标签 {%url 'add'%} 根据名字add 找到对应的 url 并访问相应的函数views.add
通过一些方法 能够得到一个结果 该结果可以访问到对应的url
使用方式 先给路由与视图函数对应关系 起一个名字 url(r'^testadd/',views.testadd,name='add') 前端解析 {% url 'add' %} 后端(views)解析 from django.shortcuts import render,HttpResponse,redirect,reverse reverse('add')
前端解析解释:
后端解析(views的函数)
有无名分组反向解析 (前端指定参数传给后端) 详见 bms
url(r'^edit_book/(?P<edit_id>\d+)/',views.edit_book,name='edit'),
<a href="{% url 'edit' book_obj.pk %}" class="btn btn-primary btn-sm">编辑</a>
无名分组反向解析
# 无名分组反向解析 url(r'^testadd/(\d+)/',views.testadd,name='add') 前端解析 {% url 'add' 1 %} 后端解析 reverse('add',args=(12,))
有名反向解析
# 有名分组反向解析 url(r'^testadd/(?P<year>\d+)/',views.testadd,name='add') 前端解析 {% url 'add' 1 %} # 推荐使用 {% url 'add' year= 1 %} # 标准的 后端解析 reverse('add',args=(12,)) reverse('add',kwargs={'year':12})
作业:无名分组编辑功能 根据day50的增删改来练习
路由分发
路由分发
当django项目比较庞大的时候 路由与视图函数对应关系较多
总路由代码太多冗长
考虑到总路由代码不好维护 django支持每个app都可以有自己的urls.py
并且总路由不再做路由与视图函数的对应关系 而仅仅只做一个分发任务的操作
根据请求的不同 识别出当前请求需要访问的功能属于哪个app然后自动
下发到对应app里面的urls.py中 然后由app里面的urls.py做路由与视图函数的匹配
不仅如此每个app除了可以有自己的urls.py之外 还可以有自己的static文件夹 templates模板文件
基于上面的特点 基于django分小组开发 会变得额外的简单
每个人只需要开发自己的app即可 之后只需要创建一个空的django项目
将多个人的app全部拷贝项目下 配置文件注册
总路由分发一次
目的:多个app分模块开发 创建APP startapp app_02 新建app要在setting里面注册
使用方法:
1.总路由 from django.conf.urls import url,include # 总路由分发 注意事项应用名后面千万不能加$ # 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)) # 简写 url(r'^app01/',include('app01.urls')), url(r'^app02/',include('app02.urls')) 2.子路由 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) ]
名称空间:
不同的app url 可能相同,为了避免不同app 反相解析 找到相同的url
名称空间(了解) url(r'^app01/',include('app01.urls',namespace='app01')) url(r'^app02/',include('app02.urls',namespace='app02')) 后端解析 reverse('app01:index') reverse('app02:index') 前端解析 {% url 'app01:index' %} {% url 'app02:index' %}
一般情况下 我们在起别名的时候加上应用前缀即可
# 在给路由与视图函数起别名的时候只需要保证永远不出现冲突的情况即可 # 通常情况下我们推荐期别名的时候加上当前应用的应用名前缀 url(r'^index/',views.index,name='app01_index') url(r'^index/',views.index,name='app02_index')
虚拟环境
我们想做到针对不同的项目 只安装项目所需要的功能模块
项目用不到的一概不装 来避免加载资源时的消耗
如何创建虚拟环境
虚拟环境就类似于一个纯净的python解释器环境
大白话 没创建一个虚拟幻境就类似于你重新下载一个python解释器
虚拟环境不推荐你使用太多
学习阶段我们还是用本机的环境即可 将所有模块全部装到本机环境下
django 版本区别
路由层
1.X用的是 url 2.X、3.X用的是 path url第一个参数是一个正则表达式 而path第一个参数不支持正则表达式 写什么就匹配什么 如果你觉得path不好用 2.x、3.x给你提供了一个跟url一样的功能 re_path 等价于1.x里面的url功能
五种转换方式先不需要记,用的时候参考小猿博客
虽然path不支持正则表达式 但是它给你提供了五种默认的转换器 str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式 int,匹配正整数,包含0。 slug,匹配字母、数字以及横杠、下划线组成的字符串。 uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。 path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?) path('login/<int:year>/',login)
除了默认的五种转换器之外 还支持你自定义转换器 class MonthConverter: regex='\d{2}' # 属性名必须为regex def to_python(self, value): return int(value) def to_url(self, value): return value # 匹配的regex
伪静态
伪静态
url以.html结尾 给人的感觉好像是这个文件是写死的 内容不会轻易的改变
伪静态
为了提高你的网站被搜索引擎收藏的力度 提供网站的SEO查询效率
但是 无论你怎么做优化 都抗不过RMB玩家