我有一个金字塔网络服务,代码示例如下:
查看声明:
@view_config(route_name="services/Prices/GetByTicker/")
def GET(request):
ticker = request.GET('ticker')
startDate = request.GET('startDate')
endDate = request.GET('endDate')
period = request.GET('period')
路由:
config.add_route('services/Prices/GetByTicker/', 'services/Prices/GetByTicker/{ticker}/{startDate}/{endDate}/{period}')
现在我知道这一切都搞砸了,但我不知道金字塔的惯例是什么。目前这是有效的,因为请求被成功路由到视图,但后来我得到一个“字典对象不可调用”异常。
网址看起来很可怕:
@根/服务/价格/ GetByTicker /股票= APPL /的startDate = 19981212 /结束日期= 20121231 /周期= d
理想情况下,我希望能够使用类似以下的URL:
@根/服务/价格/ GetByTicker /股票= APPL&安培;?的startDate = 19981212&安培;结束日期= 20121231&安培;周期= d
任何金字塔在那里愿意花五分钟来解释我做错了什么?
答案 0 :(得分:12)
从您的示例代码,我认为您使用URL Dispatch
所以应该是这样的
config.add_route('services/Prices/GetByTicker/', 'services/Prices/GetByTicker/')
那么URL就像:
@根/服务/价格/ GetByTicker /股票= APPL&安培;?的startDate = 19981212&安培;结束日期= 20121231&安培;周期= d
会匹配它
- edit--
您不必为route_name使用“services / Prices / GetByTicker”之类的名称,您可以使用request.params['key']
来获取GET参数
查看声明:
@view_config(route_name="services_Prices_GetByTicker")
def services_Prices_GetByTicker(request):
ticker = request.params['ticker']
startDate = request.params['startDate']
endDate = request.params['endDate']
period = request.params['period']
路由:
config.add_route('services_Prices_GetByTicker', 'services/Prices/GetByTicker/')
答案 1 :(得分:5)
查询字符串变为request.GET
字典。您正在使用括号来调用字典而不是通过括号访问项目。对于诸如
@根/服务/价格/ GetByTicker /股票= APPL&安培;?的startDate = 19981212&安培;结束日期= 20121231&安培;周期= d
request.GET['ticker'] # -> 'APPL' or an exception if not available
request.GET.get('ticker') # -> 'APPL' or None if not available
request.GET.get('ticker', 'foo') # -> 'APPL' or 'foo' if not available
request.GET.getall('ticker') # -> ['APPL'] or [] if not available
如果您希望多次提供ticker
,则最后一个选项很有用。
request.params
是request.GET
和request.POST
的组合,后者是表示表单上传中请求的正文的字典。
无论如何,答案是request.GET('ticker')
语法上不是我提到的选项之一,停止这样做。 : - )