Работа с flask restplus Namespace и blueprint

Я работаю со своим первым приложением flask-RESTplus и сталкиваюсь с проблемами. Вот как устроен мой проект:

proj/
  - endpoints/
    - __init__.py
    - example1.py
      
  - app.py

Вот что у меня есть в init.py:

from flask import Blueprint
from flask_restplus import Api



blueprint1 = Blueprint('api', __name__)
api = Api(blueprint1,version='1.0', title='Sample API',
    description='A sample API',
)

ns = api.namespace('todos', description='todo')

Мой example1.py имеет следующий код:

from flask import Flask , request, Blueprint
from flask_restplus import Api, Resource, fields, Namespace


from endpoints import ns

todo = ns.model('Todo', {
    'task': fields.String(required=True, description='The task details')
})

@ns.route('/api_route1')
class Todo(Resource):
    '''Shows a list of all todos, and lets you POST to add new tasks'''
    @ns.doc(parser=parser)
    @ns.expect(todo)
    #@ns.marshal_list_with(todo)
    def post(self):
        #processing code
        return message

из app.py, вот как я пытаюсь вызвать приложение:

from flask import Flask , request, Blueprint
from flask_restplus import Api, Resource, fields
from werkzeug.middleware.proxy_fix import ProxyFix 
from endpoints import api

app = Flask(__name__)
app.wsgi_app = ProxyFix(app.wsgi_app)
app.register_blueprint(api)

if __name__ == '__main__':
    app.run(debug=True)

Когда я запускаю свой app.py, я получаю следующую ошибку:

Traceback (most recent call last):
  File "Python38-32\lib\site-packages\flask_restplus\api.py", line 215, in __getattr__
    return getattr(self.default_namespace, name)
AttributeError: 'Namespace' object has no attribute 'register'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "app.py", line 50, in <module>
    app.register_blueprint(api)
  File "Python38-32\lib\site-packages\flask\app.py", line 98, in wrapper_func
    return f(self, *args, **kwargs)
  File "Python38-32\lib\site-packages\flask\app.py", line 1167, in register_blueprint
    blueprint.register(self, options, first_registration)
  File "Python38-32\lib\site-packages\flask_restplus\api.py", line 217, in __getattr__
    raise AttributeError('Api does not have {0} attribute'.format(name))
AttributeError: Api does not have register attribute

Я просматривал документацию по этой ссылке, но не смог получить это работающий. Любая помощь будет оценена по достоинству!

Примечание. У меня есть Python 3.8 и flask-restplus 0.11.0.


person user2966197    schedule 10.12.2020    source источник


Ответы (1)


Проблема в том, что вы регистрируете объект Api в приложении, а не в схеме. В упомянутой вами документации показано, что blueprint импортируется как api

from flask import Flask
from apis import blueprint as api

app = Flask(__name__)
app.register_blueprint(api, url_prefix='/api/1')
app.run(debug=True)

так что если вы делаете

from endpoints import blueprint1 as api

app = Flask(__name__)
app.register_blueprint(api)

он будет работать правильно!

person mtshaikh    schedule 11.12.2020