Django之路由分配系统

时间:2022-12-18 19:05:29

前言:

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个视图函数)

def routers():
from day52.urls import URlpattern
return URlpattern def application(environ,start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
path=environ.get('PATH_INFO')
print(path)
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(' ',8800,application)
t.serve_forever()

本文主要介绍 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 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了

Django之路由分配系统

四、路由别名(应用站点权限管理)

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之路由分配系统的更多相关文章

  1. Django框架--路由分配系统

    Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...

  2. Django 的路由分配系统

    Django的路由系统 URL配置(URL.conf)就像Django所支撑网站的目录,它的本质是URL与要为该URL调用的视图函数之间的映射表. 我们就是以这种方式告诉Django,遇到哪个URL的 ...

  3. django之路由(url)

    前言: Django大致工作流程 1.客户端发送请求(get/post)经过web服务器.Django中间件. 到达路由分配系统 2.路由分配系统根据提取 request中携带的的url路径(path ...

  4. Python学习笔记整理总结【Django】【MVC&sol;MTV&sol;路由分配系统(URL)&sol;视图函数 (views)&sol;表单交互】

     一.Web框架概述  Web框架本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env python # -*- coding:utf-8 ...

  5. django的路由系统

    在django生成的工程项目文件中urls.py文件用于指定路由信息 该文件默认导入以下模块 from confimport from import admin from confimport url ...

  6. django之路由层

    一 Django中路由的作用 二 简单的路由配置 三 有名分组 四 路由分发 五 反向解析 六 名称空间 七 django2.0版的path 一 Django中路由的作用 URL配置(URLconf) ...

  7. Python学习(三十一)—— Django之路由系统

    转载自:http://www.cnblogs.com/liwenzhou/p/8271147.html Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLc ...

  8. Django之路由

    Django的路由系统 URL配置(URLconf)就像Django所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. 我们就是以这种方式告诉Django,遇到哪个URL的时 ...

  9. Django之路由系统 Dj

    Django之路由系统   Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调 ...

随机推荐

  1. virt manager 提示权限不允许&lpar;ubuntu&rpar;

    问题描述: 新安装virt manager 打开提示权限不允许(ubuntu 15.04); 提示检查libvirt-bin包是否安装:libvirtd服务是否已运行:当前用户是否在libvirtd组 ...

  2. CSS制作图片水平垂直居中

    所谓的图片水平垂直居中就是把图片放在一个容器元素中(容器大于图片尺寸或是指定了大小的容器),并且图片位居此容器正中间(中间是指元素容器的正中间),而图片不是以背景图片(background-image ...

  3. JSF 2 outputText example

    In JSF 2.0 web application, "h:outputText" tag is the most common used tag to display plai ...

  4. eclipse慢 优化(转)

    1.打开 eclipse.ini -showsplash com.genuitec.myeclipse.product --launcher.XXMaxPermSize 256M -vmargs -D ...

  5. python datetime模块strptime&sol;strptime format常见格式命令&lowbar;施罗德&lowbar;新浪博客

    python datetime模块strptime/strptime format常见格式命令_施罗德_新浪博客     python datetime模块strptime/strptime form ...

  6. Grub启动配置文件

    和许多其他linux发行版一样,Fedora使用Grub作为32位和64位X86系统的启动加载器(bootloader).grub的配置文件主要是/boot/grub/grub.conf,而/boot ...

  7. spring-springmvc-jdbc小案例

    此案例是为ssm作铺垫的. 创建一个银行账户和基金账户,然后通过银行账户购买基金.由spring.springmvc.spring自带的c3p0实现. 废话不多说.如下 涉及到的 jar包(多了): ...

  8. mybatis 报The content of elements must consist of well-formed character data or markup&period; 语法格式错误

    最近在写sql的时候 同时使用到了 >= 和 <= 之前只使用一个的时候 没有什么问题,今天同时使用到了两个,结果xml出现了The content of elements must co ...

  9. QT槽函数处理线程

    今天用到QTcpSocket的时候,由于客户端发起请求在一个线程里,当readyRead的信号发出后接收的槽函数是否还会在该线程里处理? 现在看来其实是交给主线程处理的,那么我要实现在线程里处理怎么实 ...

  10. 16&period;4-uC&sol;OS-III同步 (任务信号量)

    信号量和消息队列均是单独的内核对象,是独立于任务存在的. 任务信号量 仅发布给一个特定任务 .任务消息队列 可以发布给多个任务. 任务信号量伴随任务存在,只要创建了任务,其任务信号量就是该任务的一个数 ...