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

Posted 财经知识狂魔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\'}),
]

 

以上是关于Django分发控制器urls--白话聊Django系列的主要内容,如果未能解决你的问题,请参考以下文章

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

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

Django - 路由控制

Djang之基于角色的权限控制(RBAC)

django中的url控制

Django基础2---url控制器模块与views视图模块