python开发路由器_Django之路由分配系统

前言:

Django大致工作流程

1、客户端发送请求(get/post)经过web服务器、Django中间件、 到达路由分配系统

2、路由分配系统根据提取 request中携带的的url路径(path)与视图函数映射关系列表中,匹配到1个视图函数,foo(request)执行;

3、视图函数 使用原生SQL或者ORM去数据库拿到数据,在服务端进行渲染(模板+数据渲染)

4、视图函数return一个 response对象 返回客户端

Django路由分配系统简介

Django project目录中的urls.py文件中, 以Python [ (   )  ]的数据类型记录了可以访问到该站点的url 和 视图函数一一对应关系表,当request请求到达路由系统,Django通过request中携带的path 遍历这个关系表,匹配到对应的视图函数,break;(所以1个 url 只能从路由关系表中自上而下匹配到1个视图函数)

defrouters():from day52.urls importURlpatternreturnURlpatterndefapplication(environ,start_response):

start_response('200 OK', [('Content-Type', 'text/html')])

path=environ.get('PATH_INFO')print(path)

urloattern=routers()

func=Nonefor i inurloattern:if path==i[0]:

func=i[1]break

iffunc:returnfunc(environ)else:return [b'404']if __name__ == '__main__':

t=make_server(' ',8800,application)

t.serve_forever()

View Code

本文主要介绍 Django路由分配系统

一、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),

]

二、在客户端通过url中的 path向后端传参数

在前端我们不仅可以通过get请求携带参数的方式向server端传数据; https://i.cnblogs.com/%EF%BC%9Fid=1&name=alex

Django也允许通过,path路径的方式向server端传值;

注意事项:按位置,和按关键字路由系统只能用1种,不能混合使用;

1、path正则无名分组匹配《---------》视图函数按位置传参

from django.conf.urls importurl,includefrom django.contrib importadminfrom app1 importviews

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\d{4})/(?P\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 importurl,includefrom django.contrib importadminfrom app1 importviews

urlpatterns=[

url(r'^index/(P\w+)/(P\w+)/',views.index,name="zhanggen"),

url(r'^(?P\d{4})/(?P\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\d{4})/$(?P\d{2})',timeer2) #timeer(request,year=2017,month=6) 正则设置了有名分组,视图函数使用关键字传参

]

在视图函数定义2个关键字参数, 接收 2个正则表达式匹配到的后缀;

defindex(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),

删除

defstudent_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 importurl,includefrom django.contrib importadminfrom app1 importviews

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 importurl,includefrom django.contrib importadminfrom app1 importviews

urlpatterns=[url(r'^index/(?P\w+)/(?P\w+)/',views.index,name="alex"), 给这个URL起别名 alex

url(r'^',views.error),

]

在视图函数使用reverse("别名", args=(1, 2)) 反生 位置参数动态路由的 别名

defindex(request,n1,n2):print(reverse("zhanggen", args=(1, 2)))return render(request,'index.html',{'i':1,'i1':2})

在视图函数使用reverse("别名",kwargs={"关键字参数":1,"关键字参数":2 }反生 关键字参数动态路由的 别名

defindex(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})

Title

{{ i }}

{% url "zhanggen" i i1%}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值