使用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条件和循环的使用方法
Nov 01 Python
python使用Image处理图片常用技巧分析
Jun 01 Python
python基于xmlrpc实现二进制文件传输的方法
Jun 02 Python
Python分布式进程中你会遇到的问题解析
May 28 Python
Python 窗体(tkinter)按钮 位置实例
Jun 13 Python
python根据时间获取周数代码实例
Sep 30 Python
根据tensor的名字获取变量的值方式
Jan 04 Python
Python 实现Image和Ndarray互相转换
Feb 19 Python
django修改models重建数据库的操作
Mar 31 Python
python实现与redis交互操作详解
Apr 21 Python
Python中猜拳游戏与猜筛子游戏的实现方法
Sep 04 Python
如何用Python 实现全连接神经网络(Multi-layer Perceptron)
Oct 15 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+ajax实时输入自动搜索匹配的方法
2014/12/26 PHP
php下pdo的mysql事务处理用法实例
2014/12/27 PHP
php实现按照权重随机排序数据的方法
2015/01/09 PHP
PHP+MySQL插入操作实例
2015/01/21 PHP
php中的常用魔术方法汇总
2016/02/14 PHP
php实现的pdo公共类定义与用法示例
2017/07/19 PHP
javascript 特殊字符串
2009/02/25 Javascript
JavaScript 异步调用框架 (Part 2 - 用例设计)
2009/08/03 Javascript
JQuery 将元素显示在屏幕的中央的代码
2010/02/27 Javascript
javascript实现原生ajax的几种方法介绍
2013/09/21 Javascript
FF IE浏览器修改标签透明度的方法
2014/01/27 Javascript
jquery插件之定时查询待处理任务数量
2014/05/01 Javascript
jQuery实现的一个tab切换效果内部还嵌有切换
2014/08/10 Javascript
JavaScript严格模式禁用With语句的原因
2014/10/20 Javascript
再JavaScript的jQuery库中编写动画效果的指南
2015/08/13 Javascript
AngularJS中的Directive实现延迟加载
2016/01/25 Javascript
canvas实现图像布局填充功能
2017/02/06 Javascript
一个Js文件函数中调用另一个Js文件函数的方法演示
2017/08/14 Javascript
Node.js使用Express.Router的方法
2017/11/14 Javascript
Vue路由钩子之afterEach beforeEach的区别详解
2018/07/15 Javascript
layui弹出层按钮提交iframe表单的方法
2018/08/20 Javascript
利用Vue实现一个markdown编辑器实例代码
2019/05/19 Javascript
jquery轻量级数字动画插件countUp.js使用详解
2019/10/17 jQuery
Vue简单实现原理详解
2020/05/07 Javascript
python安装pil库方法及代码
2019/06/25 Python
在PyCharm中遇到pip安装 失败问题及解决方案(pip失效时的解决方案)
2020/03/10 Python
Python3爬虫中关于Ajax分析方法的总结
2020/07/10 Python
python 解决函数返回return的问题
2020/12/05 Python
HTC VIVE美国官网:VR虚拟现实眼镜
2018/02/13 全球购物
给市场的环保建议书
2014/05/14 职场文书
初级党校心得体会
2014/09/11 职场文书
争先创优演讲稿
2014/09/15 职场文书
有子女的离婚协议书怎么写(范本)
2014/09/29 职场文书
前台接待员岗位职责
2015/04/15 职场文书
nginx location中多个if里面proxy_pass的方法
2021/03/31 Servers
Django实现聊天机器人
2021/05/31 Python