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:
- 获取/项目
- 获取/项目/
- 获取/项目/[ID]
- POST/项目
- PUT /items/[ID]
- 删除/项目/[ID]
我担心的是 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
我正在用 Tornado 编写 REST API。我的目标是在我的应用程序配置中每个处理程序 class 只有一个处理程序定义。
这是我得到的正则表达式:
url(r"/items/?([?P<item_id>\w])?", ItemHandler)
匹配以下 verbs/actions:
- 获取/项目
- 获取/项目/
- 获取/项目/[ID]
- POST/项目
- PUT /items/[ID]
- 删除/项目/[ID]
我担心的是 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