如何通过urls.py设置从url获取** kwargs?

时间:2014-08-09 05:48:07

标签: python django

我正在构建Django的RESTful API。

一个API有6个参数,它们都有默认值。基本上我希望用户传递0到6对参数,视图函数使用默认休息。并且参数是无序的

例如:

/month/6/date/12/    # for June 12
/year/2012/month/6/  # for June, 2012 
/date/12/year/2012/  # for 12 in every month in 2012

我希望这可行,但不能

# in urls.py
url(r'(?:([a-zA-Z]+)/(\d+)/)*','kwargs.views.aview')

# in views.py
def aview(request,*args):
    # even in args are keys and odd are values 
    return HttpResponse(args)

在这一刻,我脑子里只有一个丑陋的解决方案:

   # in urls.py
url(r'([\w/]*)','kwargs.views.aview')

# in views.py
def aview(request,args):
    args = args.split('/')
    # even in args are keys and odd are values 
    return HttpResponse(args)

有没有优雅的方法呢?

1 个答案:

答案 0 :(得分:0)

在你的第一个正则表达式中,你确实只有两个组,它们一直被覆盖。我建议一个不那么难看的解决方案,通过检查正则表达式中url的正确性,但只在一个整个组中,并拆分并将单个参数转换为dict:

url(r'((?:(?:[a-zA-Z]+)/(?:\d+)/)*)','kwargs.views.aview')

def aview(request,args):
    args = dict(zip(*[iter(args.split('/'))]*2))
    return HttpResponse(args)

编辑:使用正确的reg-exp。