想象一下具有以下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网址中的参数输入?
答案 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