如何处理 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]
使用 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]