开始前,先上一张图,让理解Django内部的处理流程,从图中我们可以知道Django内部使用MTV架构,那今天讲的第一个部分就是控制器,在Tornado框架中叫做路由系统,负责把url映射到相应的处理逻辑上去,在Django里是view处理,叫视图,大概了解后,我接下来就去看看这个分发器怎么实现以及怎么使用吧

  url模式与视图函数的映射表

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/', views.index),
]

  为什么是url模式,因为在url里采用的是正则表达式进行一一映射的,通过正则表达式,你可以实现把多个相似的url映射到同一视图函数来进行统计处理

  url(正则表达式,view函数,参数,别名)

  正则表达式灵活匹配你想要的url

urlpatterns = [
url(r'^articles/2003/$', views.special_case_2003),
url(r'^articles/([0-9]{4})/$', views.year_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]

  这里需要的注意的是,前端提交过来的数据封装在请求对象里,在定义视图函数需要用一个参数接受这个对象,参数名任意命名,正则表达式中涉及到用组去捕获的话,在视图函数里也要用参数去接受,有几个组,就用多少个参数接收

  比如下面是正则表达式里有两个组的

def index(req,num,num2):
print(num)
print(num2)
if req.method == "POST":
name = req.POST.get('Name',None)
pwd = req.POST.get('Pwd',None)
print(name,pwd)
return HttpResponse('success')
return render(req,'index.html')

  另外正则表达式里是支持指定组名的,如果正则表达式使用这个方式进行匹配,在视图函数里,接收参数的名称就不能随便起了,一定要是指定的组名

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/(?P<n1>\d)(?P<n2>\d)', views.index),
] def index(req,n1,n2):
print(n1)
print(n2)
if req.method == "POST":
name = req.POST.get('Name',None)
pwd = req.POST.get('Pwd',None)
print(name,pwd)
return HttpResponse('success')
return render(req,'index.html')

  第二参数,不仅可以传入views里的视图函数,还可以传入include实现app的路由分发,从而实现松耦合的作用,一家大点的公司下面会有多个业务的,一般会按业务板块分成多个app

,为能url不相干扰,就可以这样进行路由映射

  实现路由分发三步走:

  第一步,在之前的url文件导入include,加入分发映射关系

from django.conf.urls import url
from django.contrib import admin
from app01 import views
from django.conf.urls import include urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/(?P<n1>\d)(?P<n2>\d)', views.index),
#这里实现路由分发
url(r'^car/', include('app01.urls')),
]

  第二步,在app下创建一个urls.py文件,加入url与视图函数映射关系

from django.conf.urls import url
from . import views urlpatterns = [
url('buy/(?P<year>\d{4})(?P<month>\d)',views.home)
]

  第三步,定义视图函数

def home(req,year,month):
print(year)
print(month)
return HttpResponse('ok')

  直接访问http://127.0.0.1:8000/car/buy/12345就可以了

  第三参数:可以以字典的方式传值传给视图函数,视图函数必须要有参数接收

from django.conf.urls import url
from . import views urlpatterns = [
url('buy/(?P<year>\d{4})(?P<month>\d)',views.home,{'foo':'bar'})
]
def home(req,year,month,foo):
print(foo)
print(year)
print(month)
return HttpResponse('ok')

  如果在app的url映射关系加了这个参数,只是对当前的url起作用,如果在路由分发加入这个参数,则是整个app下的url起作用,这个参数你用在 针对url实现不同要求,比如不同的url可能要实现连接不同的数据库,这个可以传个操作句柄,或者不同url实现怎样的缓存

from django.conf.urls import url
from django.contrib import admin
from app01 import views
from django.conf.urls import include urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/(?P<n1>\d)(?P<n2>\d)', views.index),
#全局f
url(r'^car/', include('app01.urls'),{'f':'f'}),
]
from django.conf.urls import url
from . import views urlpatterns = [
#局部foo
url('buy/(?P<year>\d{4})(?P<month>\d)',views.home,{'foo':'bar'}),
url('money',views.money),
]
def home(req,year,month,foo,f):
print(f)
print(foo)
print(year)
print(month)
return HttpResponse('ok') def money(req,f):
print(f)
return HttpResponse('ok')

  第四参数:别名,当url发生变化的时候,前端通过别名进行post数据,照样能访问同样的内容,进入到同样的逻辑

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="{% url 'BIEMING' %}" method="post">
用户名:<input type="text" name="username">
密码:<input type="password" name="password">
<input type="submit" value="提交">
</form>
</body>
</html>
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/(?P<n1>\d)(?P<n2>\d)', views.index),
url(r'^bieming', views.bieming,name='BIEMING'), #全局f
url(r'^car/', include('app01.urls'),{'f':'f'}),
]

Django分发控制器urls--白话聊Django系列的更多相关文章

  1. Django models ORM基础操作--白话聊Django系列

    上次我们讲完了views视图,那我们这次来看一下Django强大的ORM,可以这么说,你不懂Django的ORM,你就不懂Django,那废话不多说 ORM又称关系对象映射,在ORM里,一张表就是一个 ...

  2. 第三百零四节,Django框架,urls.py模块,views.py模块,路由映射与路由分发以及逻辑处理——url控制器

    Django框架,urls.py模块,views.py模块,路由映射与路由分发以及逻辑处理——url控制器 这一节主讲url控制器 一.urls.py模块 这个模块是配置路由映射的模块,当用户访问一个 ...

  3. 二 Django框架,urls.py模块,views.py模块,路由映射与路由分发以及逻辑处理——url控制器

    Django框架,urls.py模块,views.py模块,路由映射与路由分发以及逻辑处理——url控制器 这一节主讲url控制器 一.urls.py模块 这个模块是配置路由映射的模块,当用户访问一个 ...

  4. PyCharm中Django项目主urls导入应用中views的红线问题

    PyCharm中Django项目主urls导入应用中views的红线问题 使用PyCharm学习Django框架,从项目的主urls中导入app中的views的时候,导入的包中下面有红线报错,但是却能 ...

  5. Django templates 和 urls 拆分

    如果在Django项目 下面新建了blog和polls两个APP应用,在每个APP下面都各自新建自己的url和templates,那么我们需要如何进行项目配置呢? INSTALLED_APPS = [ ...

  6. web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例

    Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...

  7. Django 2.0 学习(01):Django初识与安装

    Django(Python Web框架) Django是一个开放源代码的Web框架,用Python写的.采用了MTV的框架模式,即模型M,模板T和视图V.它最初被开发是用来管理以新闻内容为主的网站,即 ...

  8. django, CentOS7+nginx(apache)+mod_wsgi+Python+Django

    Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的框架模式,即模型M,视图V和控制器C.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS ...

  9. 【Django】Apache上运行单个Django项目,mod_wsgi配置

    1 安装环境 操作系统:Ubuntu 12.04 LTS 32 位(安装在VMware虚拟机中) python 版本: Python 2.7.3 Django版本 >>> djang ...

随机推荐

  1. HBase总结(十八)Hbase rowkey设计一

    hbase所谓的三维有序存储的三维是指:rowkey(行主键),column key(columnFamily+qualifier),timestamp(时间戳)三部分组成的三维有序存储. 1.row ...

  2. [1-7] 把时间当做朋友(李笑来)Chapter 7 【从此时此刻开始改变】 摘录

    大多数事情都需要提前准备,也都可以提前准备.认识到这一点本身就几乎是一切改变的起点. 任何动作演练到一定的次数,就能做到甚至在无意识的情况下都可以准确完成的地步.而他只不过是把这个原理应用到了极致而已 ...

  3. Eclipse安装Properties Editore插件

    Properties Editor for Eclipse3[1].0-3.2安装使用-http://jzgl-javaeye.iteye.com/blog/386010 PropertiesEdit ...

  4. asp.net core mvc视频A:笔记6-1.应用发布与部署

    显示:直接使用上节课的项目 一.使用vs发布应用 这里选择发布到文件夹,当然你可以选择其他的发布方式 部署模式:(我的VS里没有这个配置,不知道为啥...视频里有) 1.框架依赖:选择此模式,发布后需 ...

  5. atitit.项目设计模式---ioc attilax总结v4 q11

    atitit.项目设计模式---ioc attilax总结v4 q11 1. ioc的原理1 1.1. .IOC的之前1 1.2. ioc后的实现2 1.3. ioc的演化2 1.4. 依赖注入和控制 ...

  6. C++语言基础(19)-模板的显式具体化

    应用背景: 例如有下面的函数模板,它用来获取两个变量中较大的一个: template<class T> const T& Max(const T& a, const T&a ...

  7. python学习之pyenv

    我们经常有这种需求: linux系统中既要有python2.xxx,又要有python3.xxx,甚至更极端的情况是,有多个版本的python3.xxx. 如何实现上述需求呢?更新python的话,费 ...

  8. cmake工程使用distcc

    distcc可以加速编译,但是遇到cmake可能就需要处理下. 问题 distcc在 /usr/lib/distcc 中放了各编译器的soft link(如cc/gcc等等),如果 /usr/lib/ ...

  9. 【转载】使用SoapUI 测试Web Service

    转载地址:使用SoapUI 测试Web Service   如何测试写好的Webservice?你当然可以写代码来测试,但还是太麻烦,你得花时间去学习各语言的关于Webservice调用的相关API. ...

  10. C - Aladdin and the Flying Carpet 有多少种长方形满足面积为a(<=10^12),且最短边>=b;长方形边长为整数,且一定不可以是正方形。

    /** 题目:C - Aladdin and the Flying Carpet 链接:https://vjudge.net/contest/154246#problem/C 题意:有多少种长方形满足 ...