5

我有一个 Pyramid Web 服务,代码示例如下:

查看声明:

@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}')

现在我知道这一切都搞砸了,但我不知道 Pyramid 的约定是什么。目前这可以工作,因为请求成功地路由到视图,但随后我得到一个“字典对象不可调用”异常。

URL 看起来很糟糕:

@root/services/Prices/GetByTicker/ticker=APPL/startDate=19981212/endDate=20121231/period=d

理想情况下,我希望能够使用类似以下的 URL:

@root/services/Prices/GetByTicker/?ticker=APPL&startDate=19981212&endDate=20121231&period=d

那里有任何 Pyramid bods 愿意花五分钟来解释我做错了什么吗?

4

2 回答 2

14

从您的示例代码中,我认为您使用的是URL Dispatch

所以应该是这样的

config.add_route('services/Prices/GetByTicker/', 'services/Prices/GetByTicker/')

然后像这样的 URL:
@root/services/Prices/GetByTicker/?ticker=APPL&startDate=19981212&endDate=20121231&period=d
将匹配它

--edit--
您不必为 route_name 使用类似“services/Prices/GetByTicker”的名称,您可以获取 GET 参数使用request.params['key']
视图声明:

@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/')
于 2013-02-06T11:52:09.587 回答
5

查询字符串变成request.GET字典。您正在使用括号来调用字典,而不是通过括号访问项目。对于一个网址,如

@root/services/Prices/GetByTicker/?ticker=APPL&startDate=19981212&endDate=20121231&period=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')语法上不是我提到的选项之一,停止这样做。:-)

于 2013-02-06T16:30:09.013 回答