django路由层
目录
路由匹配
产生的问题
- url方法:第一个参数是正则表达式
只要第一个参数正则表达式能够匹配到内容那么就会立刻停止往下匹配,直接执行对应的视图函数
urlpatterns = [
url(r'test',views.test),
url(r'testadd',views.testadd),
]
# 127.0.0.1:8080/testadd 会直接和第一个路由匹配上,永远运行不了下面testadd页面
解决方案
解决方案1
- 解决思路:可以在路由后面加上斜杠
/
进行匹配
urlpatterns = [
url(r'test/',views.test),
url(r'testadd/',views.testadd),
]
# 127.0.0.1:8080/testadd 两个路由其实都匹配不上,但是django会默认加上斜杠,浏览器在请求的时候会请求两次,一次是testadd,一次是testadd/,而第二次请求是重定向
# 如何取消django自动加斜杠的方式:settings.py中设置:APPEND_SLASH = False,True是默认自动加上斜杠
- 产生的新问题
在`test/`前后加任意的字符都可以匹配
解决方案2
- 解决思路:输入的url后缀必须只能是test/
urlpatterns = [
# ^是指匹配的字符必须以什么开始 $是指匹配的字符必须以什么结尾
url(r'^test/$',views.test),
url(r'testadd/',views.testadd),
]
最终解决方案 --- 完整版
- 首页不在路由与视图的对应关系中
urlpatterns = [
# 首页,正则表达式不能写空,否则会匹配所有的url后缀,而导致后面的页面无法访问
url(r'^$',views.home),
# ^是指匹配的字符必须以什么开始 $是指匹配的字符必须以什么结尾
url(r'^test/$',views.test),
url(r'testadd/',views.testadd),
]
无名分组与有名分组
分组
就是给某一段正则表达式用小括号括起来
无名分组
会将括号内正则表达式匹配到的内容当作位置参数传递给对应的视图函数
url(r'test/(\d+)',views.test),
def test(request,xx):
print(xx)
return HttpResponse('test')
有名分组
就是给被分组了的正则表达式起一个别名,将括号内正则表达式匹配到的内容当作关键字参数传递给对应的视图函数
url(r'test/(?P<year>\d+)',views.test),
def test(request,year):
print(year)
return HttpResponse('test')
无名分组与有名分组是否可以混合使用
不能同时使用,但是每一个分组可以重复使用N多次
url(r'test/(\d+)/\d+)/\d+)',views.test),
url(r'test/(?P<year>\d+)/(?P<year>\d+)/(?P<year>\d+)',views.test),
反向解析
简介
通过一些方法得到一个结果,该结果可以直接访问对应的url触发视图函数
简单使用 --- 路由不涉及分组的情况
- 需求:路由需要修改,但是前端页面很多地方都用到了,怎么改呢?
1.首先给路由与视图函数的对应关系起一个别名
url(r'^func/',views.func,name='000'),
2.反向解析
- 后端反向解析,导入模块的方式,实现动态解析
from django.shortcuts import render,HttpResponse,redirect,reverse
reverse('ooo') # 返回值就是url后缀,路由
- 前端反向解析,下述代码就是通过别名找到对应关系,解析出url,然后运行对应的视图函数代码,通过别名找到路由与函数对应关系,此时前端的url与后端的url相同,类似于后端的格式化输出代码
<a href="{% url '000' %}">1</a>
进阶使用 --- 有名无名分组反向解析
分组的反向解析理解
- 定义
通过一些方法得到一个结果,该结果可以直接访问对应的url触发视图函数
- 反向解析
方法:前端的模版语法,以及后端的reverse
结果:分组后的正则在反向解析的时候,需要前端提供组内正则表达式能够匹配的表达式,再通过完整的正则表达式找到对应的视图函数,执行该函数。
分组反向解析的大概流程:路由的正则表达式中存在分组,如果想要通过反向解析的方式访问该url,后端就需要给reverse方法提供两个参数,一个是路由与视图函数对应关系的别名,另一个就是能够被分组的正则表达式匹配的数据(原因是django无法判断分组的正则表达式所对应的数据是什么,因此这个数据是需要手动指定的),这样后端就能够通过reverse方法得到能够匹配到路由完整正则表达式的路由。
分组反向解析案例
详见作业https://www.cnblogs.com/Kathrine/p/12995494.html
路由分发
django特点
-
django每一个应用都可以有自己的一个templates文件夹,urls.py static文件夹
-
基于上述的特点,django能够非常好的做到分组开发,每个人只写自己的APP
-
如何将所有的app整合到一起?
只需要将所有的app全部复制到一个新的django项目中,然后再配置文件中注册所有的app,再利用路由分发的特点将所有的app整合起来
- 当一个django项目中的url特别多的时候,总路由urls.py代码非常冗余不好维护,这个时候也可以利用路由分发来减轻总路由的压力
- 利用路由分发之后,总路由不再干路由与视图函数的直接对应关系,而是路由与每个app的对应关系
路由分发代码实现
实现方式一
- 总路由urls.py
from django.conf.urls import url,include
from django.contrib import admin
from app01 import urls as app01_url
from app02 import urls as app02_url
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^app01/',include(app01_url)),
url(r'^app02/',include(app02_url))
]
- app01---urls.py
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'^index/',views.index),
url(r'^foo/',views.foo),
]
- app02---urls.py
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'^index/',views.index),
url(r'^foo/',views.foo),
]
实现方式二 ---- 方式一的简化版
- 总路由urls.py
from django.conf.urls import url,include
from django.contrib import admin
# from app01 import urls as app01_url
# from app02 import urls as app02_url
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^app01/',include('app01.urls')),
url(r'^app02/',include('app02.urls'))
]
名称空间
问题
当多个应用中路由与视图函数对应关系的别名重复了,反向解析是否会自动识别应用前缀
- 正常情况下反向解析无法自动识别前缀
解决方法 --- 名称空间
总路由
url(r'^app01/',include('app01.urls',namespace='app01')),
url(r'^app02/',include('app02.urls',namespace='app02'))
反向解析语法
reverse('app01:reg')
reverse('app02:reg')
- 一般情况下多个app的时候,在起别名的时候会加上app的前缀,这样的话就能够确保多个app之间名字不冲突的问题
伪静态
静态网页
数据是写死的,万年不变
伪静态
将一个动态网页伪装成静态网页
为何要进行伪装
伪装的目的在于增大网站的seo查询力度,并且增加搜索引擎收藏网站的概率
搜索引擎本质就是巨大的爬虫程序
但是,无论怎么伪装怎么优化始终打不过RMB玩家
如何进行伪装
urlpatterns = [
url(r'^index.html',views.index,name='index'),]
# 路由加上.html后缀即可