使用 sqlalchemy 的 python flask_restless 不会生成 api 端点并使用蓝图给出 "has no attribute extensions" 错误
python flask_restless with sqlalchemy doesn't generate api endpoints and gives "has no attribute extensions" error using blueprints
对于我的网络应用程序,我想自动生成一个 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)
应用模块的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
- 运行 on http://0.0.0.0:5000/(按 CTRL+C 退出)
- 重新启动统计数据
- 调试器已激活!
- 调试器密码:122-170-707
我设法通过转移使用 flask_sqlalchemy 而不是纯 sqlalchemy 来让它工作。
对于我的网络应用程序,我想自动生成一个 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)
应用模块的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
- 运行 on http://0.0.0.0:5000/(按 CTRL+C 退出)
- 重新启动统计数据
- 调试器已激活!
- 调试器密码:122-170-707
我设法通过转移使用 flask_sqlalchemy 而不是纯 sqlalchemy 来让它工作。