Django之路由分发系统

时间:2022-02-03 03:11:34

web的基本工作流程

首先,我们先来思考一下我们平常在上网浏览网页时候的场景,大致就是打开一个web浏览器,输入某一个网站的地址,然后转到该网址,在浏览器中得到该网址的页面。从这个场景中我们可以抽象出来几个基本对象,我们(用户)、web浏览器(客户端)和发送过来页面的地方(服务端),这些对象其实就是整个web工作流程中的重要组成部分。

Django之路由分发系统

为了加强理解,其实可以将这个工作流程看做去吃饭时点餐的流程,web浏览器就是服务员,而服务端就是厨房。你给服务员说你要点什么菜,然后服务员将你点的菜端上来,具体厨房里是怎么忙活的也并不知道,其实web服务器就相当于厨师,有着各种各样的技能,根据你的成菜要求,为你进行服务,数据库在这里可以认为是个菜窖,需要什么菜去拿什么菜。

django工作基本流程

  1. 客户端发送请求(get/post)  经过web服务器、中间件、到达路由分发系统
  2. 路由分发系统根据request中携带的url路径(path)与识图函数映射关系,匹配到1个视图函数,并且执行视图函数
  3. 在视图函数中,如果有关数据库相关的操作,通过原生SQL或ORM从数据库获取数据,然后渲染到模板,生成一个html文件,如果没有就直接返回一个html文件
  4. 在视图函数最后 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'']
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>