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

一 使用多个视图前缀:

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

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

  1. 使用正则表达式:

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

用一个例子说明一下这个概念。 如果我们用尾部不是$的模式’^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/后面的这个数字传给视图函数

  1. urlpatterns+=[url(r'^test/(\d{4})',views.function_test),]
  1. views.py中的视图函数中增加一个参数对应(\d{4})。这里的参数year对应的就是(\d{4})
  1. def function_test(request,year):
  2.     print year
  1.  
  1. 包装视图函数
  1. 在这里我们使用一个高级的技巧。加入在views.py中存在大量的视图函数需要对登录的安全进行验证。也就是每个函数都需要首选判断requedst.is_secure()
  1. def test1(request):
  2.     if request.is_secure():
  3.         return HttpResponse('is secured')
  4.     else:
  5.         return HttpResponse('not secured')
  6.  
  7. def test2(request):
  8.     if request.is_secure():
  9.         return HttpResponse('is secured')
  10.     else:
  11.         return HttpResponse('not secured')
  12.  
  13. def test3(request):
  14.     if request.is_secure():
  15.         return HttpResponse('is secured')
  16.     else:
  17.         return HttpResponse('not secured')
  1. 我们是否可以对这种每个函数都需要些的判断做个简化呢。这就需要用到视图包装。来看下下面的这个函数:
  1. def requires_login(view):
  2.     def new_view(request,*args,**kwargs):
  3.         if request.is_secure():
  4.             return HttpResponse('is secured')
  5.         return view(request,*args,**kwargs)
  6.     return new_view
  1. 再在urlpatterns配置如下
  1. urlpatterns+=[
  2.               url(r'^test1/$',views.requires_login(views.test1)),
  3.               url(r'^test2/$',views.requires_login(views.test2)),
  4.               url(r'^test3/$',views.requires_login(views.test3)),]
  1. 其实方法已经很明确了,用的就是闭包函数的原理,闭包函数实现了公共部分的代码。其实和装饰器是一个道理。那么视图处理函数就可以简化成如下的形式。
  1. def test1(request):
  2.     return HttpResponse('not secured')
  3.  
  4. def test2(request):
  5.     return HttpResponse('not secured')
  6.  
  7. def test3(request):
  8.     return HttpResponse('not secured')
  1.  

Django之高级视图与URL的更多相关文章

  1. Django笔记 —— 高级视图和URL配置

    最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ...

  2. Django学习day4——视图和URL配置

    创建一个简单的hello world 在day3中我们第一次运行了服务器,里面是一个django的欢迎页面,那是因为我们没有配置URL和视图,django在底层会自动跳转这个页面上 我们在mysite ...

  3. 测试开发之Django——No8.Django中的视图与URL配置

    在Django中,页面内容是靠views function(视图函数)来产生,URL定义在URLconf中. 这是一个纯净项目的url配置文件,他存在的目录,是与setting文件在同一个目录中. u ...

  4. django1.8高级视图和URL配置读书笔记

    一.在url配置中可以通过导入视图函数来将url模式和对应的函数对象进行映射,也可以通过字符串的形式进行映射.字符串包含应当是模块名.函数名的组合例如: 之前: from mysite import ...

  5. Django框架1——视图和URL配置

    三个命令 1.创建一个django项目 在cmd中:django-admin.py startproject project_name D:\python\django_site>django- ...

  6. django-高级视图和url配置

    高级视图和url配置 一.URLconf技巧 1.流线型化函数导入 对于配置url,我们可以使用以下几种方式: (1)引入view中的函数 from firstSite.view import cur ...

  7. Python+Django+SAE系列教程9-----Django的视图和URL

    第三.四.五章介绍的就是Django中MVC的视图.模板.模型了. 首先来看视图(view),在用Django生成的站点目录中,创建一个view.py文件,这个文件開始是空的.然后我们输入下面内容: ...

  8. django学习笔记(一)视图和url配置

    1.开始一个项目: 进入创建的目录,然后: django-admin startproject myblog 2.启动开发服务器: python manage.py runserver 注:默认是80 ...

  9. Django之视图和URL配置

    1.在创建项目时,Django会自动创建URL配置,在urls.py文件中 文件的默认内容如下所示: """mysite URL Configuration The ur ...

随机推荐

  1. Python collections系列之双向队列

    双向队列(deque) 一个线程安全的双向队列 1.创建一个双向队列 import collections d = collections.deque() d.append(') d.appendle ...

  2. 前用户sudo免密码

      Ubuntu 设置当前用户sudo免密码 方法1 # 备份 /etc/sudoers sudo cp /etc/sudoers . #打开 /etc/sudoers sudo visudo # 在 ...

  3. ping错误详解

    在网络中Ping 是一个十分好用的TCP/IP工具,它主要的功能是用来检测网络的连通情况和分析网络速度. 输入 ping /? 例出ping的参数 使用Ping检查连通性有五个步骤 1. 使用ipco ...

  4. 蓝桥杯 算法训练 ALGO-146 4-2找公倍数

    算法训练 4-2找公倍数   时间限制:1.0s   内存限制:256.0MB        查看参考代码 问题描述 这里写问题描述. 打印出1-1000所有11和17的公倍数. 样例输入 一个满足题 ...

  5. PATL2-007. 家庭房产-并查集

    L2-007. 家庭房产 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定每个人的家庭成员和其自己名下的房产,请你统计出每个 ...

  6. Vue开发模板简介

    1.    传统发开模式的问题 用传统模式引用vue.js以及其他的js文件的开发方式,会产生一些问题. 基于页面的开发模式:传统的引用vue.js以及其他的js文件的开发方式,限定了我们的开发模式是 ...

  7. 数据校验(3)--demo2---bai

    input_user.jsp <%@ page language="java" import="java.util.*" pageEncoding=&qu ...

  8. noip2017D2T3的几种写法...(BIT/线段树/平衡树)

    题意各大oj上都有啦..想必来搜题解的都看过题面了...Qw Solution1: 首先观察n=1的情况,显然就是中间删掉一个数后面加上一个数,并查询那个删掉的数(以后把这样一个过程称为一个操作啦(( ...

  9. java 多线程系列---JUC原子类(一)之框架

    根据修改的数据类型,可以将JUC包中的原子操作类可以分为4类. 1. 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ;2. 数组类型: AtomicIn ...

  10. struts1.2里的ActionMessages的使用

    转自:https://blog.csdn.net/oswin_jiang/article/details/4582187