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

2024-04-28 14:10:31 发布

您现在位置:Python中文网/ 问答频道 /正文

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

视图声明:

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

现在我知道这一切都搞砸了,但我不知道金字塔的惯例是什么。目前这是可行的,因为请求被成功地路由到视图,但随后我得到一个“Dictionary object not callable”异常。

网址看起来很糟糕:

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

理想情况下,我希望能够使用如下URL:

@root/services/Prices/GetByTicker/?股票代码=APPL&startDate=19981212&endDate=20121231&period=d

任何金字塔的人都愿意花五分钟来解释我做错了什么?


Tags: 视图config路由getrequestservicerootroute
2条回答

查询字符串将转换为request.GET字典。您使用括号来调用字典,而不是通过括号访问项。对于url,例如

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

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

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

所以应该是这样

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

然后URL如下:
@根目录/服务/价格/GetByTicker/?ticker=APPL&startDate=19981212&endDate=20121231&period=d
会匹配的

--编辑--
您不必使用“services/Prices/GetByTicker”这样的名称作为路由名称,您可以使用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/')

相关问题 更多 >