使用web.py的Restful API

时间:2017-06-10 12:07:58

标签: python rest web.py

在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的网址?

2 个答案:

答案 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'
)