前言:
Django的工作流程
1、客户端发送请求到达 URL
2、路由系统 把客户端请求转发给请求函数
3、视图函数 使用原生SQL或者ORM去数据库拿到数据进行渲染(模板+数据渲染)
4、return 返回给客户端
Django project目录中的urls.py文件中 记录了 可以访问到该站点的url 和 视图函数的对应关系,神似路由器中的路由表,顾淫王赐名----->路由系统;
本文主要介绍 Django路由系统(此乃淫王 赐名,暂且这样称呼!)
一、普通路由系统
1个URL对应1个视图函数
from django.conf.urls import url from django.contrib import admin from APP import view urlpatterns = [ url(r‘^modal/‘,view.modal), url(r‘^域名‘,对应的处理函数) 注意不要忘了写 ^ 表示正则匹配以。。开头的URL url(r‘^modal_add/‘,view.modal_add), url(r‘^modal_del/‘,view.modal_del), url(r‘^modal_edit/‘,view.modal_edit), ]
二、动态路由
动态路由系统:在普通路由系统的基础上 加入了 正则表匹配
注意事项:按位置,和按关键字路由系统只能用1种,不能混合使用;
1、按正则位置 匹配url的动态路由系统
from django.conf.urls import url,include from django.contrib import admin from app1 import views urlpatterns = [ url(r‘^index/(\w+)/(\w+)/‘,views.index2), #酱紫的话客户端 输入:http://127.0.0.1:8000/index/a/b/也可以访问到该站点 url(r‘^‘,views.error) ]
在视图函数定义2个参数, 接收 2个正则表达式匹配到的后缀;
def index(request,a1,a2):
print(a1,a2) #打印参数a1,a2 就是 2个正则表达式匹配到的结果
#注意如果按位置传参的动态路由系统,必须在视图函数添加对应的参数接收!
2、按正则关键字 匹配url的动态路由系统
from django.conf.urls import url,include from django.contrib import admin from app1 import views urlpatterns = [ url(r‘^index/(P<n1>\w+)/(P<n2>\w+)/‘,views.index,name="zhanggen"), url(r‘^‘,views.error), ] #注意如果在路由系统正则内部定义了关键字n1,n2,视图函数接收参数也必须是 n1,n2;
在视图函数定义2个关键字参数, 接收 2个正则表达式匹配到的后缀;
def index(request,n1,n2): print(n1,n2) #注意必须和 路由系统中的一致 return HttpResponse(‘OK‘)
补充:
PS:
终止符:^edit$ 可以精确限制匹配URL的后缀内容
伪静态:url(r‘^edit/(\w+).html$‘, views.edit) 装作成静态网站的url可以 提高 SEO高权重 百度排名靠前
三、路由分发
1个Django 项目里面有多个APP目录大家共有一个 url容易造成混淆,于是路由分发让每个APP的拥有了自己单独的url;
from django.conf.urls import url,include from django.contrib import admin from app1 import views urlpatterns = [ url(r‘^app1/‘,include(‘app1.urls‘)), url(r‘^app2/‘,include(‘app1.urls‘)), #注意include的是字符串形式的 文件路径; url(r‘^‘,views.error), ]
酱紫就可以在每个 Django目录下面写自己的 URL了
四、路由别名(应用站点权限管理)
给Django路由系统URL--视图函数对应关系命个名,然后在Python和模板中reverse、usl 反生成 访问该站点URL
作用:给路由系统中URL定义别名,通过别名反生出URL可以在Python和模板URL方便使用
from django.conf.urls import url,include from django.contrib import admin from app1 import views urlpatterns = [ url(r‘^index/(?P<n1>\w+)/(?P<n2>\w+)/‘,views.index,name="alex"), 给这个URL起别名 alex url(r‘^‘,views.error), ]
在视图函数使用 reverse("别名", args=(1, 2)) 反生 位置参数动态路由的 别名
def index(request,n1,n2): print(reverse("zhanggen", args=(1, 2))) return render(request,‘index.html‘,{‘i‘:1,‘i1‘:2})
在视图函数使用 reverse("别名",kwargs={"关键字参数":1,"关键字参数":2 }反生 关键字参数动态路由的 别名
def index(request,n1,n2): print(reverse("zhanggen",kwargs={"n1":1,"n2":2 })) return render(request,‘index.html‘,{‘i‘:1,‘i1‘:2})
在模板中反生 URL
注意 在视图函数中 return render(request,‘index.html‘,{‘i‘:1,‘i1‘:2})
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <p>{{ i }}</p> <p>{% url "zhanggen" i i1%}</p> </body> </html>