Django之路由分发系统
web的基本工作流程
首先,我们先来思考一下我们平常在上网浏览网页时候的场景,大致就是打开一个web浏览器,输入某一个网站的地址,然后转到该网址,在浏览器中得到该网址的页面。从这个场景中我们可以抽象出来几个基本对象,我们(用户)、web浏览器(客户端)和发送过来页面的地方(服务端),这些对象其实就是整个web工作流程中的重要组成部分。
为了加强理解,其实可以将这个工作流程看做去吃饭时点餐的流程,web浏览器就是服务员,而服务端就是厨房。你给服务员说你要点什么菜,然后服务员将你点的菜端上来,具体厨房里是怎么忙活的也并不知道,其实web服务器就相当于厨师,有着各种各样的技能,根据你的成菜要求,为你进行服务,数据库在这里可以认为是个菜窖,需要什么菜去拿什么菜。
django工作基本流程
- 客户端发送请求(get/post) 经过web服务器、中间件、到达路由分发系统
- 路由分发系统根据request中携带的url路径(path)与识图函数映射关系,匹配到1个视图函数,并且执行视图函数
- 在视图函数中,如果有关数据库相关的操作,通过原生SQL或ORM从数据库获取数据,然后渲染到模板,生成一个html文件,如果没有就直接返回一个html文件
- 在视图函数最后 return一个HTTPresponse对象,这个对象携带我们生成的模板文件,返回到客户端,渲染到页面。
django路由分发系统简介
Django项目目录中的urls.py文件中,以python列表中嵌套元祖的形式记录了视图函数与url路径的映射关系,当一个客户端的请求到达路由系统,通过请求体获取用户请求路径,然后通过正则在
urlpatterns列表中自上而下逐个匹配,如果匹配成功,就会执行相应的视图函数。如果有一个以上的匹配成功,只会执行urlpatterns中最靠前的项。
from wsgiref.simple_server import make_server # Create your views here. def index(request): return [b'hello'] def routers(): return [('/index/',index),] def application(environ,start_response): start_response('200 OK', [('Content-Type', 'text/html')]) path=environ.get('PATH_INFO') urloattern=routers() func=None for i in urloattern: if path==i[0]: func=i[1] break if func: return func(environ) else: return [b'404'] if __name__ == '__main__': t=make_server('',8000,application) t.serve_forever()
客户端通过url向后端传递参数
在前端我们不仅可以通过get请求携带参数的方式向服务端传数据;
https://127.0.0.1/index/?id=1&name=alex
Django也允许通过,path路径的方式向server端传值;
注意事项:按位置,和按关键字路由系统只能用1种,不能混合使用;
1 path 正则无名分组匹配----->视图函数按位置传递参数
按位置传参形参或实参错位会导致数据错乱,所以Django路由分发系统还可以以命名分组的形式匹配URL给视图函数按关键字传参;
from django.conf.urls import url,includefrom app1 import views urlpatterns = [ url(r'^index/(P<n1>\w+)/(P<n2>\w+)/',views.index,name="index"), ] #注意如果在路由系统正则内部定义了关键字n1,n2,视图函数接收参数也必须是 n1,n2;
#在视图函数定义2个关键字参数, 接收 2个正则表达式匹配到的后缀; def index(request,n1,n2): print(n1,n2) #注意必须和 路由系统中的一致 return HttpResponse('OK')
2、URL path传值应用
有了动态路由就 可以不用在 url?nid=8这样传值了!
终止符:^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>
出处:https://home.cnblogs.com/u/richiewlq/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,
且在文章页面明显位置给出原文连接。