zoukankan      html  css  js  c++  java
  • Django之高级视图与URL

    Urls.py中有我们所有的路由映射关系。但是随着网站功能的增多,需要配置的URL也变得多了起来。并且维护这些导入也变得很麻烦。因此介绍一些优化和简洁的方法:

    一 使用多个视图前缀:

    之前所有的路由关系都是包含在一个urlpatterns里面

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^index/',views.index),
        url(r'^show_all/',views.show_all_infor),
        url(r'^result1/',views.result1),
        url(r'^result2/',views.result2),
        url(r'^result3/',views.result3),
        url(r'^books_inquiry/',views.books_inquery_result),
    ]
     
    但其实我们可以将urlpatterns进行拼接。就像下面的这样。
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^index/',views.index),
        url(r'^show_all/',views.show_all_infor),
        url(r'^result1/',views.result1),
        url(r'^result2/',views.result2),
        url(r'^result3/',views.result3),
        url(r'^books_inquiry/',views.books_inquery_result),
    ]
    urlpatterns+=[url(r'^test/',views.function_test),]
     
    二 调试模式:
    说到动态构建 urlpatterns,你可能想利用这一技术,在 Django 的调试模式下修改 URLconf 的行为。 为了做到这一点,只要在运行时检查 DEBUG 配置项的值即可
    首先在setting.py中需要将DEBUG设置为TRUE。在urls.py中增加DEBUG的判断
    from django.conf import settings
    if settings.DEBUG:
        urlpatterns+=[url(r'^debuginfo/',views.debug),]
    如果DEBUG值为False.则会提示找不到这个URL

    三 使用正则表达式:

    模式包含了一个尖号(^)和一个美元符号($)。这些都是正则表达式符号,并且有特定的含义: 上箭头要求表达式对字符串的头部进行匹配,美元符号则要求表达式对字符串的尾部进行匹配。

    用一个例子说明一下这个概念。 如果我们用尾部不是$的模式’^hello/’,那么任何以/hello/开头的URL将会匹配,例如:/hello/foo 和/hello/bar,而不仅仅是/hello/。类似地,如果我们忽略了尖号(^),即’hello/$’,那么任何以hello/结尾的URL将会匹配,例如:/foo/bar/hello/。如果我们简单使用hello/,即没有^开头和$结尾,那么任何包含hello/的URL将会匹配,如:/foo/hello/bar。因此,我们使用这两个符号以确保只有/hello/匹配,不多也不少。

    另外一个重点,正则表达式字符串的开头字母“r”。 它告诉Python这是个原始字符串,不需要处理里面的反斜杠(转义字符)。

    下面是一些基本的用法:

    . (dot)

    任意单一字符

    d

    任意一位数字

    [A-Z]

    A 到 Z中任意一个字符(大写)

    [a-z]

    a 到 z中任意一个字符(小写)

    [A-Za-z]

    a 到 z中任意一个字符(不区分大小写)

    +

    匹配一个或更多 (例如, d+ 匹配一个或 多个数字字符)

    [^/]+

    一个或多个不为‘/’的字符

    *

    零个或一个之前的表达式(例如:d? 匹配零个或一个数字)

    *

    匹配0个或更多 (例如, d* 匹配0个 或更多数字字符)

    {1,3}

    介于一个和三个(包含)之前的表达式(例如,d{1,3}匹配一个或两个或三个数字)

     

    继续深入下,我们已经设计了一个带通配符的URL,我们有没有方法将它传递到视图中去呢。答案是有的,使用圆括号把参数在URL模式里标识出来然后传递给视图函数。来看一个例子:

    在这个url中,test/后面跟的是4个长度的数字。通过(d{4})可以将test/后面的这个数字传给视图函数

    urlpatterns+=[url(r'^test/(d{4})',views.function_test),]
    在views.py中的视图函数中增加一个参数对应(d{4})。这里的参数year对应的就是(d{4})
    def function_test(request,year):
        print year
     
    四 包装视图函数
    在这里我们使用一个高级的技巧。加入在views.py中存在大量的视图函数需要对登录的安全进行验证。也就是每个函数都需要首选判断requedst.is_secure()
    def test1(request):
        if request.is_secure():
            return HttpResponse('is secured')
        else:
            return HttpResponse('not secured')

    def test2(request):
        if request.is_secure():
            return HttpResponse('is secured')
        else:
            return HttpResponse('not secured')

    def test3(request):
        if request.is_secure():
            return HttpResponse('is secured')
        else:
            return HttpResponse('not secured')
    我们是否可以对这种每个函数都需要些的判断做个简化呢。这就需要用到视图包装。来看下下面的这个函数:
    def requires_login(view):
        def new_view(request,*args,**kwargs):
            if request.is_secure():
                return HttpResponse('is secured')
            return view(request,*args,**kwargs)
        return new_view
    再在urlpatterns配置如下
    urlpatterns+=[ 
                  url(r'^test1/$',views.requires_login(views.test1)),
                  url(r'^test2/$',views.requires_login(views.test2)),
                  url(r'^test3/$',views.requires_login(views.test3)),]
    其实方法已经很明确了,用的就是闭包函数的原理,闭包函数实现了公共部分的代码。其实和装饰器是一个道理。那么视图处理函数就可以简化成如下的形式。
    def test1(request):
        return HttpResponse('not secured')

    def test2(request):
        return HttpResponse('not secured')

    def test3(request):
        return HttpResponse('not secured')
    
    
  • 相关阅读:
    第三章感想
    第二章感想
    第一章感想
    第9章 硬件抽象层:HAL
    第10章 嵌入式linux的调试技术
    第8章 蜂鸣器驱动
    第七章 I/O
    第六章 编写Linux驱动程序
    第五章 S3C6410
    源代码的下载和编译
  • 原文地址:https://www.cnblogs.com/zhanghongfeng/p/8231766.html
Copyright © 2011-2022 走看看