"Missing 1 required positional argument: 'resp'" 调用具有 'self' 参数的 Falcon 资源响应程序时
"Missing 1 required positional argument: 'resp'" when invoking Falcon resource responder that has a 'self' argument
我正在 Windows 上开发 WSGI 应用程序。我使用 peewee(这应该是无关的)和:
falcon==2.0.0
waitress==1.4.3
我的 resources.py
中有以下代码:
from models import Board
class BoardResource:
def on_get_collection(self, req, resp):
resp.media = Board.select()
def on_get(self, req, resp):
code = req.get_param('code')
resp.media = Board.get_by_id(code)
我的 app.py
中有以下代码:
import falcon
import models
from resources import BoardResource
def init():
models.init()
api = falcon.API()
api.add_route('/boards', BoardResource, suffix='collection')
api.add_route('/board', BoardResource)
return api
api = init()
我使用此命令启动应用程序:waitress-serve app:api
。当我从 API 请求 /boards
时,出现此错误:
ERROR:waitress:Exception while serving /boards
Traceback (most recent call last):
File "c:\users\pepsiman\.virtualenvs\hsech-api\lib\site-packages\waitress\channel.py", line 349, in service
task.service()
File "c:\users\pepsiman\.virtualenvs\hsech-api\lib\site-packages\waitress\task.py", line 169, in service
self.execute()
File "c:\users\pepsiman\.virtualenvs\hsech-api\lib\site-packages\waitress\task.py", line 439, in execute
app_iter = self.channel.server.application(environ, start_response)
File "c:\users\pepsiman\.virtualenvs\hsech-api\lib\site-packages\falcon\api.py", line 269, in __call__
responder(req, resp, **params)
TypeError: on_get_collection() missing 1 required positional argument: 'resp'
我决定从 on_get_collection
的定义中删除 self
参数,错误消失了。我知道 self
一定在那里,但不知道为什么它不能那样工作。有什么解决办法吗?
我自己发现了问题:当调用 api.add_route
时,响应者 class 确实必须被实例化,因此下面几行:
api.add_route('/boards', BoardResource, suffix='collection')
api.add_route('/board', BoardResource)
需要这样修改:
api.add_route('/boards', BoardResource(), suffix='collection')
api.add_route('/board', BoardResource())
当然,它可以在不从定义中删除 self
参数的情况下工作。
我希望我的这个愚蠢的错误能帮助别人改正他们的错误。
我正在 Windows 上开发 WSGI 应用程序。我使用 peewee(这应该是无关的)和:
falcon==2.0.0
waitress==1.4.3
我的 resources.py
中有以下代码:
from models import Board
class BoardResource:
def on_get_collection(self, req, resp):
resp.media = Board.select()
def on_get(self, req, resp):
code = req.get_param('code')
resp.media = Board.get_by_id(code)
我的 app.py
中有以下代码:
import falcon
import models
from resources import BoardResource
def init():
models.init()
api = falcon.API()
api.add_route('/boards', BoardResource, suffix='collection')
api.add_route('/board', BoardResource)
return api
api = init()
我使用此命令启动应用程序:waitress-serve app:api
。当我从 API 请求 /boards
时,出现此错误:
ERROR:waitress:Exception while serving /boards
Traceback (most recent call last):
File "c:\users\pepsiman\.virtualenvs\hsech-api\lib\site-packages\waitress\channel.py", line 349, in service
task.service()
File "c:\users\pepsiman\.virtualenvs\hsech-api\lib\site-packages\waitress\task.py", line 169, in service
self.execute()
File "c:\users\pepsiman\.virtualenvs\hsech-api\lib\site-packages\waitress\task.py", line 439, in execute
app_iter = self.channel.server.application(environ, start_response)
File "c:\users\pepsiman\.virtualenvs\hsech-api\lib\site-packages\falcon\api.py", line 269, in __call__
responder(req, resp, **params)
TypeError: on_get_collection() missing 1 required positional argument: 'resp'
我决定从 on_get_collection
的定义中删除 self
参数,错误消失了。我知道 self
一定在那里,但不知道为什么它不能那样工作。有什么解决办法吗?
我自己发现了问题:当调用 api.add_route
时,响应者 class 确实必须被实例化,因此下面几行:
api.add_route('/boards', BoardResource, suffix='collection')
api.add_route('/board', BoardResource)
需要这样修改:
api.add_route('/boards', BoardResource(), suffix='collection')
api.add_route('/board', BoardResource())
当然,它可以在不从定义中删除 self
参数的情况下工作。
我希望我的这个愚蠢的错误能帮助别人改正他们的错误。