使用url_helper简化Python中Django框架的url配置教程


Posted in Python onMay 30, 2015

django的url采用正则表达式进行配置,虽然强大却也广为诟病。反对者们认为django的url配置过于繁琐,且不支持默认的路由功能。

我倒觉得还好,只是如果觉得不爽,为什么不自己小小的hack一下,反正也就几行代码的事。

在这个背景下,我整了这个url_helper,利用url_helper可以简化配置和实现url的默认路由。所谓的url_helper其实就只有url_helper.py一个文件,使用的时候只想要import就可以。

url_helper的具体用法请参考具体的例子:

url_helper下载/范例

下面对使用方法做个简单的说明。
url的默认路由

 

from url_helper import execute, url_
import views
 
urlpatterns += patterns('',
  url(r'^(?P<urls>.*)', execute, {'views': views}),
)

在urls.py里增加如下配置,其中views为需要进行路由的views模块。url的规则为 /action/param1/param2/…/ 。

例如:

 

#/edit/4/
 
def edit(request, n="id"):
  html = """ edit object: %s""" % n
  return HttpResponse(html)

在没有指定action的时候默认使用的action为index。
提供函数url_简化url配置

仿照ROR的做法,参数用”:”标识。

例如:
 

#url_(r'/space/:username/:tag/', views.url_), 
#/space/vicalloy/just/
 
def url_(request, username, tag):
  html = """ username: %s <br/> tag: %s""" % (username, tag)
  return HttpResponse(html)

url_helper的完整代码

就如前面说的,代码非常少。不过实际应用的话,应当还需要做一些扩展。

 

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
from django import http
from django.conf.urls.defaults import url
import re
 
def execute(request, urls, views):
  """
  urls [methodName/]param1/param2/.../
  methodName default index
  """
  def get_method(views, methodName):
    try:
      return getattr(views, methodName)
    except Exception, e:
      return None
  method = None
  params = [e for e in urls.split("/") if e]
  params.reverse()
  if params:
    method = get_method(views, params.pop())
  if not method:
    method = get_method(views, 'index')
  if not method:
    raise http.Http404('The requested admin page does not exist.')
  return method(request, *params)
 
def url_(*args,**dic):
  regex = args[0]
  if regex[0] == "/":
    regex = regex[1:]
  regex = '^' + regex
  regex = regex + '$'
  regex = re.sub(":[^/]+",
      lambda matchobj: "(?P<%s>[^/]+)" % matchobj.group(0)[1:],
      regex)
  return url(regex, *args[1:], **dic)
Python 相关文章推荐
python基础教程之缩进介绍
Aug 29 Python
Django框架下在URLconf中指定视图缓存的方法
Jul 23 Python
浅谈Python单向链表的实现
Dec 24 Python
Python全局变量用法实例分析
Jul 19 Python
Python网络爬虫项目:内容提取器的定义
Oct 25 Python
python 实现在Excel末尾增加新行
May 02 Python
Python常见字典内建函数用法示例
May 14 Python
用vue.js组件模拟v-model指令实例方法
Jul 05 Python
简单了解python元组tuple相关原理
Dec 02 Python
python每5分钟从kafka中提取数据的例子
Dec 23 Python
python绘制动态曲线教程
Feb 24 Python
Python scrapy爬取小说代码案例详解
Jul 09 Python
在Python的Django框架中simple-todo工具的简单使用
May 30 #Python
Python中Django框架下的staticfiles使用简介
May 30 #Python
简单介绍Python的Django框架的dj-scaffold项目
May 30 #Python
Python的Django框架中settings文件的部署建议
May 30 #Python
Python的Django中django-userena组件的简单使用教程
May 30 #Python
在SAE上部署Python的Django框架的一些问题汇总
May 30 #Python
python实现比较两段文本不同之处的方法
May 30 #Python
You might like
PHP flush()与ob_flush()的区别详解
2013/06/03 PHP
PHP session_start()问题解疑(详细介绍)
2013/07/05 PHP
PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定
2014/06/12 PHP
Cygwin中安装PHP方法步骤
2015/07/04 PHP
thinkphp3.2实现上传图片的控制器方法
2016/04/28 PHP
php使用json-schema模块实现json校验示例
2019/09/28 PHP
JSON 编辑器实现代码
2009/12/06 Javascript
jquery选择器(常用选择器说明)
2010/09/28 Javascript
在多个页面使用同一个HTML片段的代码
2011/03/04 Javascript
jquery使用经验小结
2015/05/20 Javascript
JavaScript截断字符串的方法
2015/07/15 Javascript
简单谈谈gulp-changed插件
2017/02/21 Javascript
详解AngularJS通过ocLazyLoad实现动态(懒)加载模块和依赖
2017/03/01 Javascript
基于zTree树形菜单的使用实例
2017/12/25 Javascript
基于Axios 常用的请求方法别名(详解)
2018/03/13 Javascript
微信小程序缓存支持二次开发封装实现解析
2019/12/16 Javascript
vue element实现表格合并行数据
2020/11/30 Vue.js
原生js实现滑块区间组件
2021/01/20 Javascript
Python3连接MySQL(pymysql)模拟转账实现代码
2016/05/24 Python
python魔法方法-自定义序列详解
2016/07/21 Python
Python正确重载运算符的方法示例详解
2017/08/27 Python
Python进程间通信之共享内存详解
2017/10/30 Python
Python使用wget实现下载网络文件功能示例
2018/05/31 Python
Tensorflow使用tfrecord输入数据格式
2018/06/19 Python
Python中如何导入类示例详解
2019/04/17 Python
python模拟哔哩哔哩滑块登入验证的实现
2020/04/24 Python
Pandas缺失值2种处理方式代码实例
2020/06/13 Python
Python限制内存和CPU使用量的方法(Unix系统适用)
2020/08/04 Python
pytorch学习教程之自定义数据集
2020/11/10 Python
css3媒体查询中device-width和width的区别详解
2020/03/27 HTML / CSS
汤米巴哈马官方网站:Tommy Bahama
2017/05/13 全球购物
主键(Primary Key)约束和唯一性(UNIQUE)约束的区别
2013/05/29 面试题
给定一个时间点,希望得到其他时间点
2013/11/07 面试题
工程质量承诺书
2014/03/27 职场文书
大学生军训感言
2015/08/01 职场文书
python利用pandas分析学生期末成绩实例代码
2021/07/09 Python