Django分发控制器urls--白话聊Django系列

  开始前,先上一张图,让理解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‘}),
]
时间: 2024-11-03 19:08:24

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

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

上次我们讲完了views视图,那我们这次来看一下Django强大的ORM,可以这么说,你不懂Django的ORM,你就不懂Django,那废话不多说 ORM又称关系对象映射,在ORM里,一张表就是一个类,一行数据就是类的一个对象 在Django中遵循code first的原则,即:根据代码中定义的类来自动生成数据库表 利用ORM来实现定义表,以及对表进行操作 注意:在连接数据库上,Django默认是连接MySQLdb的,但是在python3中,不是很完美的支持这个模块,所以创建的Django项目

Django之路由(urls)层

目录 Django之路由(urls)层 路由的作用 简单的路由配置 难点解释 无名分组与有名分组 无名分组 有名分组 路由分发 为什么要分发路由 反向解析 前段解析 后端解析 无名分组反向解析 前端解析 后端解析 有名分组的反向解析 前段解析 后端解析 名称空间 总结 伪静态 虚拟环境 Django1版本和Django2 版本的区别 Django之路由(urls)层 路由的作用 路由即请求地址与视图函数的映射关系,如果把网站比喻为一本书,那路由就好比是这本书的目录,在Django中路由默认配置在

django removing hardcoded URLs in template --- 使用变量,把url放在变量中 {% url &#39;namespace:name&#39; %}

1 urlpatterns = [ 2 url(r'^admin/', admin.site.urls), 3 url(r'^votes/', include("polls.urls", namespace="polls")), 4 ] /myproject/urls.py 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 ''' 5 @version: 6 @author: leo Yang 7 @licen

django:理解urls路由

最近在看django的官方文档,跟着文档敲第一个django应用,刚开始看到第一部分关于urls路由的设置时,脑子里冒出来许多问号 一时没转过弯来,它到底是咋转发路由的??如何通过我配置的路径来定位到指定视图的? 然后自己就反复试验了几次,又仔细看了文档中的描述(我的蹩脚英语不足以支撑看原版英文文档,看的英译汉,所以翻译后有些字眼确实不好理解,没内个味道了...) OK,闲话到此为止,继续往下看 首先,我的django项目层级如下 mysite/urls.py 是根 URLconf 文件 pol

一 Django框架介绍——用pycharm创建Django项目

Django框架介绍 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的软件设计模式,即模型M,视图V和控制器C.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件.并于2005年7月在BSD许可证下发布. 这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的. 更多Django框架http://code.ziqiangxuetang.com/django/django-qrcode.htm

朱晔和你聊Spring系列S1E11:小测Spring Cloud Kubernetes @ 阿里云K8S

朱晔和你聊Spring系列S1E11:小测Spring Cloud Kubernetes @ 阿里云K8S 有关Spring Cloud Kubernates(以下简称SCK)详见https://github.com/spring-cloud/spring-cloud-kubernetes,在本文中我们主要测试三个功能: 使用Kubernetes服务发现配合Spring Cloud Ribbon做服务调用 读取Kubernetes的ConfigMap配置并且支持修改后动态刷新 Spring Bo

【白话经典算法系列之十七】 数组中只出现一次的数 其他三次

本文地址:http://blog.csdn.net/morewindows/article/details/12684497转载请标明出处,谢谢. 欢迎关注微博:http://weibo.com/MoreWindows 首先看看题目要求: 数组A中,除了某一个数字x之外,其他数字都出现了三次,而x出现了一次.请给出最快的方法找到x. 这个题目非常有意思,在本人博客中有<位操作基础篇之位操作全面总结>这篇文章介绍了使用位操作的异或来解决——数组中其他数字出现二次,而x出现一次,找出x.有<

三白话经典算法系列 Shell排序实现

山是包插入的精髓排序排序.这种方法,也被称为窄增量排序,因为DL.Shell至1959提出命名. 该方法的基本思想是:先将整个待排元素序列切割成若干个子序列(由相隔某个"增量"的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序. 由于直接插入排序在元素基本有序的情况下(接近最好情况),效率是非常高的,因此希尔排序在时间效率上比前两种方法有较大提高. 以n=10的一个数组49, 38, 65, 97

白话经典算法系列之四 直接选择排序及交换二个数据的正确实现

分类: 白话经典算法系列 2011-08-09 11:15 16682人阅读 评论(29) 收藏 举报 算法面试c 直接选择排序和直接插入排序类似,都将数据分为有序区和无序区,所不同的是直接播放排序是将无序区的第一个元素直接插入到有序区以形成一个更大的有序区,而直接选择排序是从无序区选一个最小的元素直接放到有序区的最后. 设数组为a[0…n-1]. 1.      初始时,数组全为无序区为a[0..n-1].令i=0 2.      在无序区a[i…n-1]中选取一个最小的元素,将其与a[i]交