第三篇.路由控制
一.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

浙公网安备 33010602011771号