什么是处理url参数类型的好方法?

时间:2014-07-17 15:05:19

标签: python django django-urls

想象一下具有以下url.py的应用:

urlpatterns = patterns('',
    url(r'^$', views.index),
    url(r'^double/(?P<number>\d+)/$', views.double),
)

这是views.py

def double(request, number=42):
    return HttpResponse(2*number)

显然,我希望number始终被视为int。在查询/double/5/时,我总是希望获得10,而不是55

有没有什么好方法可以处理Django网址中的参数输入?

3 个答案:

答案 0 :(得分:2)

这是一个基于装饰的解决方案:

def param_type(**type_spec):
    def deco(f):
        def view(request, **kwargs):
            for k, type_ in type_spec.items():
                kwargs[k] = type_(kwargs[k])
            return f(request, **kwargs)
        return view
    return deco

@param_type(number=int)
def double(request, number=42):
    return HttpResponse(2*number)

答案 1 :(得分:1)

This thread说自动转换不是一个好的解决方案:

  

请注意,自动转换也不是一个好计划。对于   例如,我的博客的下一个版本将像2008/2/25 /的URL转换为   2008/02/25 /因为我想要一个规范形式。所以我需要知道是否   \ d {1,2}匹配两位数之一,即使第一位数为0。   自动转换为整数将删除该功能(并且它是   不难想到像这样的其他情况)。所以你需要   configurabiliy。

它还提出了一个基于装饰器的解决方案,但我并不是真的相信,这听起来有点麻烦:

  

您的问题的一个解决方案可能是编写一个装饰器   类型列表(加上“不关心”之类的“无”)和   自动将参数N转换为第N个元素中的类型   在调用你的函数之前的列表

答案 2 :(得分:0)

安托,

我认为您的问题与网址更相关。 (?P<number>\d+)是一个正则表达式,表示\d仅允许数字与[0-9]相同。 +符号表示需要1个或更多数字。因此,如果您尝试插入类似double/notanumber/的内容,则无效。

知道这一点你可以安全地假设:

  

1:数字总是有值

     

2:数字将始终为整数(即​​使django将其作为unicode返回)

我对你的功能做了一些小改动:

def double(request, number): # removed the =42 because number can never be empty
  return HttpResponse(2 * int(number)) # Converted your number to an integer