zoukankan      html  css  js  c++  java
  • 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'}),
    ]
    
  • 相关阅读:
    supervisorctl的安装使用
    react应用多入口配置
    百度编辑器
    formData文件上传
    thymeleaf的内联th:inline(在javascript访问model中的数据)
    浅谈Object.prototype.toString.call()方法
    JS中call()和apply()以及bind()的区别
    Json对象与Json字符串的转化
    全面解析JavaScript中“&&”和“||”操作符(总结篇)
    TortoiseSVN客户端重新设置用户名和密码
  • 原文地址:https://www.cnblogs.com/xinsiwei18/p/7182495.html
Copyright © 2011-2022 走看看