Tornado URL REST API 的正则表达式:如何不为 POST 操作定义项目 ID 参数?

Tornado URL regex for REST API: how to not define the item ID argument for the POST action?

我正在用 Tornado 编写 REST API。我的目标是在我的应用程序配置中每个处理程序 class 只有一个处理程序定义。

这是我得到的正则表达式:

url(r"/items/?([?P<item_id>\w])?", ItemHandler)

匹配以下 verbs/actions:

我担心的是 POST 操作从不需要 ID 但是 Tornado 在方法定义中需要 ID 以匹配 Regex 模式:

def post(self, item_id=None):
    # item_id should be None; it is here to match the URL Regex 

您知道不同的正则表达式模式是否允许我在方法定义中不定义 item_id 参数吗?

不能对不同的 http 方法使用不同的正则表达式。您需要在 post() 方法中定义一个虚拟参数(如果存在则引发错误),或者对 with-id 和 without-id 形式使用两个不同的处理程序 classes。

不要试图巧妙地使用正则表达式,即使它们都指向同一个处理程序,也要制定多个规则 class。例如,您的正则表达式将匹配 /itemfoo,因为 / 是可选的,但这可能不是您想要的。把它分开会更干净:

url(r"/items/?", ItemHandler), # no id, optional slash
url(r"/items/(?P<item_id>\w+)", ItemHandler), # slash and id required