带有 sqlalchemy 的 python flask_restless 不会生成 api 端点并使用蓝图给出“没有属性扩展”错误

Posted

技术标签:

【中文标题】带有 sqlalchemy 的 python flask_restless 不会生成 api 端点并使用蓝图给出“没有属性扩展”错误【英文标题】:python flask_restless with sqlalchemy doesn't generate api endpoints and gives "has no attribute extensions" error using blueprints 【发布时间】:2018-08-10 13:00:21 【问题描述】:

对于我的 webapp,我想自动生成一个 REST API。我阅读了 flask_restless docs 的文章,尝试了几个教程并按照描述进行了所有操作:

我的路线将位于模块 app.main.api.pv_tool.py

from . import api
from app.__init__ import db, app
from app.models import University
import flask_restless

manager = flask_restless.APIManager(app, session=db.scoped_session)
manager.create_api(University, methods=['GET'])

@api.route('/')
def index():
    return 'asdf'

models.py

中定义了大学
from sqlalchemy import String, Integer
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

...

class University(Base):
    __tablename__ = 'unis'
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(64), nullable=False, unique=True)

    def __repr__(self):
        return '<Uni %r>' % self.name

...

并在database.py中建立与现有和填充数据库的连接:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, scoped_session

from app.models import Base


class Database:
    path = 'sqlite:///pv_tool.sqlite'
    engine = None
    session = None
    scoped_session = None

    def __init__(self, path=path):
        self.engine = create_engine(path, convert_unicode=True)
        Base.metadata.bind = self.engine

        db_session = sessionmaker(bind=self.engine, autocommit=False)
        db_session.bind = self.engine
        self.session = db_session()
        self.scoped_session = scoped_session(self.session)
        Base.metadata.create_all()

现在在我的浏览器中或使用requests 库模块我在http://localhost:5000 上得到“asdf”响应。

但是,我无法通过以下方式访问我的大学数据:localhost:5000/unis、localhost:5000/api/unis 等等。我总是收到 404 响应。

如果没有任何错误,这个问题很难解决。有谁知道我一般如何调试它以及我在代码中的错误可能是什么?

在 PyCharm 调试器中,管理器对象似乎有一些 API 可以创建: 但我不知道接下来我可以在这里寻找什么。

另外,当我尝试在 pv_tool.py 中使用 create_api_blueprints 时,我在运行时遇到错误:

...
manager = flask_restless.APIManager(app, session=db.scoped_session)
api_bp = manager.create_api_blueprint('unis', University, methods=['GET'])
app.register_blueprint(api_bp)
...


Traceback (most recent call last):   File "run.py", line 5, in <module>
    from app import app   File "/Users/rich/code/src/github.com/pv-tool-backend/app/__init__.py", line 4, in <module>
    from app.main.api import api   File "/Users/rich/code/src/github.com/pv-tool-backend/app/main/api/__init__.py", line 5, in <module>
    from . import pv_tool   File "/Users/rich/code/src/github.com/pv-tool-backend/app/main/api/pv_tool.py", line 11, in <module>
    api_bp = manager.create_api_blueprint('unis', University, methods=['GET'])   File "/Users/rich/code/src/github.com/pv-tool-backend/pv_tool_backend_venv/lib/python3.6/site-packages/flask_restless/manager.py", line 549, in create_api_blueprint
    restlessinfo = app.extensions['restless'] AttributeError: type object 'University' has no attribute 'extensions'

这就是我运行应用程序的方式:

run.py

from app import app
app.run(debug=True, host='0.0.0.0', port=5000)

app 模块的 init.py

from flask import Flask
from flask_cors import CORS
from app.main.api import api
from app.database import Database


db = Database()

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

CORS(app)

从终端开始:

rich@local:~ $ python run.py
在http://0.0.0.0:5000/ 上运行(按 CTRL+C 退出) 使用 stat 重启 调试器已激活! 调试器 PIN:122-170-707

【问题讨论】:

我设法通过使用 flask_sqlalchemy 而不是纯 sqlalchemy 来使其工作 【参考方案1】:

我设法通过使用 flask_sqlalchemy 而不是纯 sqlalchemy 来使其工作。

【讨论】:

以上是关于带有 sqlalchemy 的 python flask_restless 不会生成 api 端点并使用蓝图给出“没有属性扩展”错误的主要内容,如果未能解决你的问题,请参考以下文章

Python Flask SQLalchemy JSON POST 错误

flask强大的第三方组件之falsk-sqlalchemy

SQLAlchemy create_all() 不创建表

python SQLAlchemy多对多唯一约束仅以一种方式工作

Graphene/Flask/SQLAlchemy - 从路由入口点检索数据的推荐方法是啥?

带有更新/验证循环的 C++ FLTK 的 Fl_Input 数据