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

时间:2018-02-14 21:35:33

标签: python web.py

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

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

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

    def POST(self):
        Pass

问题: 当使用POST方法使用postman call / api / uses / 1时 会发生异常。怎么解决?

2 个答案:

答案 0 :(得分:0)

正如评论中所建议的那样,使POST方法的签名与GET相同:

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

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

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

您可以使用非捕获正则表达式:(?:\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类,并根据请求由GET或POST处理。请注意,因为您不再捕获id您的GET(self, id=None):仍然有效,但始终会为ID设置无(因为它未被捕获!)

最有可能的是,你想要的只是简单:使参数相同。

答案 1 :(得分:0)

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

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