金字塔路由匹配和查询参数

时间:2013-02-06 10:57:54

标签: python pyramid

我有一个金字塔网络服务,代码示例如下:

查看声明:

@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

任何金字塔在那里愿意花五分钟来解释我做错了什么?

2 个答案:

答案 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.paramsrequest.GETrequest.POST的组合,后者是表示表单上传中请求的正文的字典。

无论如何,答案是request.GET('ticker')语法上不是我提到的选项之一,停止这样做。 : - )