在PHPs Slim中,我可以这样做:
$app->get('/table/{table}', function (Request $request, Response $response, $args) {
$table = $args['table'];
$mapper = new TableMapper($this, $table);
$res = $mapper->getTable();
return $response->withJson($res);
}
$app->get('/table/{table}/{id}', function (Request $request, Response $response, $args) {
$table = $args['table'];
$id = (int)$args['id'];
$mapper = new TableMapper($this, $table);
$res = $mapper->getTableById($id);
return $response->withJson($res);
}
现在我尝试使用web.py.我可以这样做:
urls = (
'/table/(.+)', 'table',
)
class table:
def GET( self, table ):
rows = db.select( table )
web.header('Content-Type', 'application/json')
return json.dumps( [dict(row) for row in rows], default=decimal_default )
但如果我尝试通过这样做来扩展它,例如:
urls = (
'/table/(.+)', 'table',
'/table/(.+)/(\d+)', 'table_by_id'
)
处理永远不会到达第二个网址。相反,代码在表名上执行db.select,这是" table / id",当然也是错误。
如何开发这个以解析添加了ID的网址?
答案 0 :(得分:2)
web.py匹配urls
中列出的顺序,因此切换订单是解决问题的一种方法:
urls = (
'/table/(.+)/(\d+)', 'table_by_id',
'/table/(.+)', 'table'
)
另一条建议:收紧你的正则表达式,让你更准确地匹配你正在寻找的东西。你会早点发现错误。
例如,您会注意到/table/(.+)
确实与"/table/foo/1"
匹配,因为正则表达式.+
也匹配/
,因此您可能会考虑使用([^/]+)
这样的模式1}}匹配除了斜杠之外的“所有东西”。
最后,您的网址中不需要前导'^'或尾随'$',web.py
始终看起来与完整模式匹配。 (在内部,它添加'^'和'$')。
答案 1 :(得分:0)
试试这个:
urls = (
'^/table/(.+)/$', 'table',
'^/table/(.+)/(\d+)/$', 'table_by_id'
)