如何处理 GET 和 POST 在 web.py 框架中需要不同数量的参数

How to handle GET and POST needs different numbers of argument in web.py framework

使用 web.py 微框架开发 restful 风格的 API 服务器时。我有一个关于多个 URL 和句柄 class 的问题,http 方法功能需要不同的参数。例如:

URL:
url =['/api/users', 'User',
        '/api/users/(\d+)$, 'User']

Class:
class User(object):
    def GET(self, id=None):
         Pass

    def POST(self):
        Pass

问题: 当使用 postman 调用 /api/uses/1 和 POST 方法时 会发生异常。如何解决?

按照评论中的建议,使 POST 方法的签名与 GET:

相同
def POST(self, id=None):
   ...

您的问题是由于您的 POST 请求 /api/users/1 包含最终 ID。这意味着 webpy 匹配模式 /api/users/(\d+)$,然后由 class User 处理。如果你 GET url,它会转到 <User>.GET(),如果你 POST url,它会转到 <Users>.POST()...(DELETE转到 <User>.DELETE(),等等)

因为匹配模式包含正则表达式捕获 (\d+),匹配的值将作为附加参数传递给函数....无论调用哪个函数。

您可以使用 non-capturing 正则表达式:(?:\d+)$ 需要在 URL 中进行匹配,但不会导致匹配值作为参数传递,因此:

url = ('/api/users', 'User',
       '/api/users/(?:\d+)$', 'User')

class User(object):
    def GET(self, id=None):
        pass
    def POST(self):
        pass

现在,/api/users/api/users/1 将转到 User class,并根据请求由 GET 或 POST 处理。请注意,因为您不再捕获 id,所以您的 GET(self, id=None): 仍然有效,但 总是 将 None 作为 id(因为它不是捕获!)

很可能,您想要的很简单:使参数相同。

或者您可以使用灵活数量的参数:

def GET(*arg):
    self = arg[0]
    id = arg[1]