【发布时间】:2018-09-26 19:47:13
【问题描述】:
我目前正在尝试将 GraphQL(使用石墨烯和 flask_graphql)集成到我的烧瓶应用程序中。从here 和here 尝试了一些教程。但似乎没有一个适合我的情况。 目前我的项目是这样的
-manage.py
|app
|__init__.py (create_app is here)
|mod_graphql (this is folder)
|__init__.py (blueprint created here)
|models.py
|schema.py
|controller.py
问题出在两个教程中,建议在模型文件中创建基础和引擎,我也这样做了,但我需要使用 current_app 读取配置文件以获取 URI 以创建引擎。但实际上,因为它发生在flask初始化中,所以还没有请求上下文,所以current_app是不存在的。所以一切都失败了。 可以帮我设置一下吗?
下面是一些代码:
app/__init__.py
create_app():
...
from .mod_graphql import bp_graph
app.register_blueprint(bp_graph)
...
mod_graphql/__init__.py
from flask import Blueprint
bp_graph = Blueprint('graphql', __name__)
from . import controller
from . import models
from . import schema
mod_graphql/models.py
Base = declarative_base()
engine = create_engine(current_app.config.get('BASE_URI'),
convert_unicode=True)
db_session = scoped_session(sessionmaker(autocommit=False,
autoflush=False,
bind=engine))
Base.query = db_session.query_property()
class Model1_Model(Base):
...
class Model2_Model(Base):
...
mod_graphql/schema.py
class Model1(SQLAlchemyObjectType):
class Meta:
model = Model1_Model
interfaces = (relay.Node,)
class Model2(SQLAlchemyObjectType):
class Meta:
model = Model2_Model
interfaces = (relay.Node,)
class Query(graphene.ObjectType):
node = relay.Node.Field()
schema = graphene.Schema(query=Query, types=[Model1])
mod_graphql/controller.py
bp_graph.add_url_rule('/graphql',
view_func=GraphQLView.as_view('graphql',
schema=schema,
graphiql=True,
context={'session':
db_session}))
@bp_graph.teardown_app_request()
def shutdown_session(exception=True):
db_session.remove()
当我尝试启动服务器时,它告诉我:
在应用程序上下文之外工作
请您推荐最佳做法来设置它吗?
非常感谢!
【问题讨论】:
标签: python flask graphql flask-sqlalchemy graphene-python