Search code examples
pythonflaskflask-restful

TypeError: __init__() missing 1 required positional argument: 'id'


My intention is to get the int:id from url and store the data to self.user from init function. It works for the other functions except for init. Is there anything I need to add? or is it not possible?

@api.resource('/api/users/<int:id>', endpoint='user')
class UserAPI(Resource):
    def __init__(self, id):
        self.user = User.query.get(id)
        self.reqparse = reqparse.RequestParser()
        self.reqparse.add_argument('username', type=str,
            help='No Name Provided', location='json')
        self.reqparse.add_argument('email', type=str,
            help='No Email Provided', location='json')
        self.reqparse.add_argument('password',type=str,
            help='No Password Provided', location="json")
        super(UserAPI, self).__init__()

following is the error log:

Traceback (most recent call last):
  File "C:\Users\kw\Envs\nektime\lib\site-packages\flask\app.py", line 1836, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:\Users\kw\Envs\nektime\lib\site-packages\flask\app.py", line 1820, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "C:\Users\kw\Envs\nektime\lib\site-packages\flask_restful\__init__.py", line 265, in error_router
    return original_handler(e)
  File "C:\Users\kw\Envs\nektime\lib\site-packages\flask\app.py", line 1403, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\kw\Envs\nektime\lib\site-packages\flask\_compat.py", line 32, in reraise
    raise value.with_traceback(tb)
  File "C:\Users\kw\Envs\nektime\lib\site-packages\flask\app.py", line 1817, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\kw\Envs\nektime\lib\site-packages\flask\app.py", line 1477, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\kw\Envs\nektime\lib\site-packages\flask_restful\__init__.py", line 265, in error_router
    return original_handler(e)
  File "C:\Users\kw\Envs\nektime\lib\site-packages\flask\app.py", line 1381, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\kw\Envs\nektime\lib\site-packages\flask\_compat.py", line 32, in reraise
    raise value.with_traceback(tb)
  File "C:\Users\kw\Envs\nektime\lib\site-packages\flask\app.py", line 1475, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\kw\Envs\nektime\lib\site-packages\flask_debugtoolbar\__init__.py", line 124, in dispatch_request
    return view_func(**req.view_args)
  File "C:\Users\kw\Envs\nektime\lib\site-packages\flask_restful\__init__.py", line 446, in wrapper
    resp = resource(*args, **kwargs)
  File "C:\Users\kw\Envs\nektime\lib\site-packages\flask_httpauth.py", line 61, in decorated
    return f(*args, **kwargs)
  File "C:\Users\kw\Envs\nektime\lib\site-packages\flask\views.py", line 83, in view
    self = view.view_class(*class_args, **class_kwargs)
TypeError: __init__() missing 1 required positional argument: 'id'

Solution

  • I don't think it's possible. Since Resource will not be explicitly init with other params like id. If you look into the code of flask-restful and flask itself, you will see the Resource is kind of like some abstract class, whose functionality mostly depends on classmethod.

    By the way, RESTful means Representational State Transfer, which is supposed to be stateless. That is, there should not be any different context between different request. Letting the resource to remember the user is violating the design principle of RESTful API.