第三篇.路由控制
一.Django中路由的作用
url配置就像Django所支撑网站的目录,本质是要为该url调用视图函数的映射表,也就是以这种方式告诉Django,对应客户端发来的某个url调用哪一段逻辑代码对应执行.
二.简单的路由配置
2.3APPEND_SLASH
setting.py下配置APPEND_SLASH
# 为假,不会加反斜杠,默认为True # APPEND_SLASH=False
定义了urls.py
from django.conf.urls import url from app01 import views urlpatterns = [ url(r\'^blog/$\', views.blog), ]
访问 http://www.example.com/blog 时,默认将网址自动转换为 http://www.example/com/blog/ 。
如果在settings.py中设置了 APPEND_SLASH=False,此时我们再请求 http://www.example.com/blog 时就会提示找不到页面。
三.无名分组
3.1按位置传参
-分组之后,会把分组出来的数据,当位置参数,传到视图函数,所以,视图函数需要定义形参 -url(r\'^publish/([0-9]{4})/([0-9]{2})$\', views.publish), -def publish(request,*args): 视图函数可以这样接收
3.2无名分组的应用
urls.py下配置
from django.conf.urls import url,include from django.contrib import admin from app01 import views urlpatterns = [ url(r\'^publish/([0-9]{4})/([0-9]{2})$\', views.publish) ]
views.py下配置
from django.shortcuts import render, HttpResponse,redirect,reverse def publish(request, *args,**kwargs):#无名分组 if request.method == \'GET\': # print(year) # print(mounth) print(args) print(kwargs) return HttpResponse(\'publishok\') elif request.method == \'POST\': return HttpResponse(\'post\')
四.有名分组
4.1正则分组的应用
import re ret=re.search(\'(?P<year>[0-9]{4})/([0-9]{2})/(?P<month>[0-9]{4})\',\'1999/11/1102\') print(ret.group()) print(ret.group(1)) print(ret.group(2)) print(ret.group(\'year\')) print(ret.group(\'month\'))
上面的示例使用简单的、没有命名的正则表达式组(通过圆括号)来捕获URL 中的值并以位置 参数传递给视图。在更高级的用法中,可以使用命名的正则表达式组来捕获URL
中的值并以关键字 参数传递给视图。
在Python 正则表达式中,命名正则表达式组的语法是(?P<name>pattern),其中name 是组的名称,pattern 是要匹配的模式。
4.2按关键字传参
-按关键字传参 -有名分组之后,会把分组出来的数据,当关键字参数,传到视图函数,所以,视图函数需要定义形参,形参名字要跟分组的名字对应,与顺序无关 -url(r\'^publish/(?P<year>[0-9]{4})/(?P<mounth>[0-9]{2})/$\', views.publish), -def publish(request, mounth,year): *****有名分组和无名分组,不要混用
4.3有名分组的应用
urls.py下的配置
from django.conf.urls import url,include from django.contrib import admin from app01 import views urlpatterns = [ url(r\'^admin/\', admin.site.urls), url(r\'^publish/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$\', views.publish), ]
views.py下的配置
# def publish(request, mounth,year):#有名分组 def publish(request, *args,**kwargs):#无名分组 if request.method == \'GET\': # print(year) # print(month) print(args) print(kwargs) return HttpResponse(\'publishok\') elif request.method == \'POST\': return HttpResponse(\'post\')
总结:有名分组和无名分组不要混用
五反向解析
5.1反向解析的步骤
第一步:先命一个名:
-1 无参数:url(r\'^publishadd133/$\', views.publishadd,name=\'ddd\'), -2 无名分组:url(r\'^publishadd/([0-9]{4})/([0-9]{2})/$\', views.publishadd,name=\'ddd\'), -3 有名分组:url(r\'^publishadd/(?P<year>[0-9]{4})/(?P<mounth>[0-9]{2})/$\', views.publishadd,name=\'ddd\'),
第二步:在模板层:
-1 无参数:{% url \'ddd\' %}
-2 无名分组的:{% url \'ddd\' 2018 12 %}
-3 有名分组:{% url \'ddd\' 2018 12 %} 还可以 {% url \'ddd\' year=2018 mounth=12 %}
第三步:在视图层:
from django.shortcuts import reverse 在视图函数里: 1 无参数:url=reverse(\'ddd\') 1 无名分组:url=reverse(\'ddd\',args=(2018,12,)) 1 有名分组:url=reverse(\'ddd\',args=(2018,12,)) 还可以 url=reverse(\'ddd\',kwargs={\'year\':2018,\'mounth\':12})
5.2反向解析的应用
urls文件
from django.conf.urls import url,include from django.contrib import admin from app03 import views urlpatterns = [ url(r\'^admin/\', admin.site.urls), url(r\'^test1/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$\', views.url_test,name=\'test\'), ]
views文件
from django.shortcuts import render, HttpResponse,redirect,reverse def url_test(request,year,month): print(year) print(month) # url=reverse(\'test\',args=(1989,11))#这样可以 url=reverse(\'test\',kwargs={\'month\':12,\'year\':2018}) print(url) return render(request,\'publish.html\')
publish.html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <a href="{% url \'test\' 1989 10 %}">哈哈</a> </body> </html>
六.路由分发
6.1有什么用:
以后路由关系越来越多,可以把每一个app的路由分到自己里面,自己做处理做分发,协同开发可以自己写路由,不用去总的里面一条一条加
6.2路由分发
1 在不同的app里创建urls.py 2 在总路由 -from django.conf.urls import include -url(r\'^blog/\',include(\'clog.urls\')), -url(r\'^app01/\',include(\'app01.urls\')), 3 在不同的app的urls里配置路由关系 ***重点***总路由,不能加结束符$
第一步:创建app
第二步:setting里面记得设置
P.S
第三步:相关代码
分到app01 app
分到clog app里面
第四步最终结果
七.名称空间
-url(r\'^blog/\',include(\'blog.urls\',namespace=\'blog\')), -子路由:url(r\'^publish/$\', views.publish,name=\'test\'), -反向解析: -视图层:url = reverse(\'blog:test\')#现在指定了名称空间下的他 -模板层:{% url \'app01:test\'%} ***一般不要用*** 子路由:url(r\'^publish/$\', views.publish,name=\'app01_test\')
八.Django2.0版本的repath和path
8.1repath的用法
django2.0的re_path和1.0的url一样
urls文件
from django.contrib import admin from django.urls import path,re_path from app03 import views urlpatterns = [ # re_path(\'正则\',视图函数), re_path(\'^test/(?P<year>\d+)\',views.re_test), ]
views文件
from django.shortcuts import render,HttpResponse # Create your views here. def re_test(request,year): print(year) print(type(year)) return HttpResponse(\'这就是结果\')
8.2path的用法
urls文件
from django.contrib import admin from django.urls import path,re_path from app03 import views urlpatterns = [ # path传的第一个参数,不是正则,准确的路径,不支持正则 path(\'test/<int:year>\',views.re_test), ] #一般从前台传过来都是字符串类型,转换器能转成整数类型或别的类型
views文件
from django.shortcuts import render,HttpResponse # Create your views here. def re_test(request,year): print(year) print(type(year)) return HttpResponse(\'这就是结果\')
8.3path转化器
Django默认支持以下5个转化器:
str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式 int,匹配正整数,包含0。 slug,匹配字母、数字以及横杠、下划线组成的字符串。 uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。 path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)
8.4自定义转化器
总结
1 定义一个类: class MyCon: # 写一个正则表达式 regex = \'[0-9]{4}\' # 匹配出來的数据,会传到这里,retrun回去的,会被视图函数接收 def to_python(self, value): return int(value) # 反向解析用的 def to_url(self, value): return \'%04d\' % value 2 from django.urls import register_converter register_converter(MyCon,\'yyy\') 3 path(\'test/<yyy:year>\', views.re_test,name=\'test\'),
urls文件
from django.contrib import admin from django.urls import path,re_path,register_converter from app03 import views #自定义转化器 #1 定义一个类 里面必须有3个东西, 差一个都会报错 class MyCon: # 写一个正则表达式 regex="[0-9]{4}" # 匹配出来的数据,会传到这里,return回去的,会被试图函数接受 def to_python(self,value):#这个value对应下面的year,传进来的字符串year返回去是整数year return int(value) #反向解析用的 def to_url(self,value): return \'%04d\'%value register_converter(MyCon,\'yyy\')#和下面的yyy匹配上 urlpatterns = [ path(\'test/<yyy:year>\',views.re_test,name="test"), ] #一般从前台传过来都是字符串类型,转换器能转成整数类型或别的类型
views文件
from django.shortcuts import render,HttpResponse,reverse#reverse用于反向解析 # Create your views here. def re_test(request,year): print(year) print(type(year)) url=reverse(\'test\',args=(9,)) print(url) return HttpResponse(\'这就是结果\')
小知识点
#占8位,不够的话,用0补全,多了全部显示 print("%08d"%123)
八.伪静态
伪装成静态文件,其实不是静态文件,方便百度收录
-路由:url(r\'^book/(?P<id>\d+.html)\',views.book),#在路由上处理很简单加正则匹配就可以 -访问:http://127.0.0.1:8000/book/4.html