Django 路由
Posted zxy6
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django 路由相关的知识,希望对你有一定的参考价值。
一、Django的路由分配系统
1个URL对应1个视图函数
1
2
3
4
5
6
7
8
9
|
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), ] |
二、在客户端通过url中的 path向后端传参数
在前端我们不仅可以通过get请求携带参数的方式向server端传数据; https://i.cnblogs.com/%EF%BC%9Fid=1&name=alex
Django也允许通过,path路径的方式向server端传值;
注意事项:按位置,和按关键字路由系统只能用1种,不能混合使用;
1、path正则无名分组匹配《---------》视图函数按位置传参
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)
]
urlpatterns = [
url(r‘^/‘,index), #视图函数 index(request)
url(r‘^(d{4})/d{2}/$‘,timeer1), #视图函数 timeer1(request,实参1) 正则增加了分组,视图函数会增加一个参数;
url(r‘^(d{4})/(d{2)/$‘,timeer2) #视图函数 timeer2(request,实参1,实参2) 视图函数需要2个形参接收;
# url(r‘^(?P<year>d{4})/(?P<month>d{2})/$‘,timeer),
]
在路由系统定义了 几个正则分组(),在视图函数对应几个实参接收;
def timeer2(request,a1,a2):
print(a1,a2) #打印参数a1,a2 就是 2个正则表达式匹配到的结果
return Httprespose(‘ok‘)
#注意如果按位置传参的动态路由系统,必须在视图函数添加对应的参数接收!
2、path正则有名分组匹配《---------》视图函数按关键字传参
按位置传参形参或实参错位会导致数据错乱,所以Django路由分发系统还可以以命名分组的形式匹配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‘^(?P<year>d{4})/(?P<month>d{2})/$‘,timeer),
url(r‘^‘,views.error), ] #注意如果在路由系统正则内部定义了关键字n1,n2,视图函数接收参数也必须是 n1,n2;
urlpatterns = [
# url(r‘^/‘,index), #index(request)
# url(r‘^(d{4})/d{2}/$‘,timeer), #timeer(request,2014) 正则增加了分组,视图函数会增加一个参数;
# url(r‘^(d{4})/(d{2)/$‘,timeer1) , #timeer(request,2014,12) 视图函数需要两个形参接收
url(r‘^(?P<year>d{4})/$(?P<month>d{2})‘,timeer2) #timeer(request,year=2017,month=6) 正则设置了有名分组,视图函数使用关键字传参
]
在视图函数定义2个关键字参数, 接收 2个正则表达式匹配到的后缀;
def index(request,n1,n2): print(n1,n2) #注意必须和 路由系统中的一致 return HttpResponse(‘OK‘)
3、URL path传值应用
有了动态路由就 可以不用在 url?nid=8这样传值了!
PS:
终止符:^edit$ 可以精确限制匹配URL的后缀内容
伪静态:url(r‘^edit/(w+).html$‘, views.edit) 装作成静态网站的url可以 提高 SEO高权重 百度排名靠前
url(r‘^student_del/(.*).html/‘,views.student_del),
<a href="/student_del/{{row.id}}.html/">删除</a></td>
def student_del(request,args1): # user_id=request.GET.get(‘id‘) models.User_info.objects.filter(id=args1).delete() return redirect(‘/students/‘)
三、路由分发
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了
四、路由别名(应用站点权限管理)
1、什么是路由别名?
给Django路由分发系统 URL--视图函数对应关系命个名,
然后在模板中{% url "zhanggen" i i1%}反生成 访问该站点URL,
或者在视图函数中reverse()反向生产当前访问URL;
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="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>
以上是关于Django 路由的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Django Summernote 中显示编程片段的代码块?
django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段
django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段
Express实战 - 应用案例- realworld-API - 路由设计 - mongoose - 数据验证 - 密码加密 - 登录接口 - 身份认证 - token - 增删改查API(代码片段