Python 如何使用芹菜运行SQL并从DB获取返回的结果?
我正在使用Flask、芹菜、Redis和Mysql建立网站。现在我面临一个问题。我想将每个SQL查询发送到芹菜,一旦完成任务,我就会从芹菜中获得查询结果。 以下是我的部分代码: Manage.pyPython 如何使用芹菜运行SQL并从DB获取返回的结果?,python,flask,celery,flask-sqlalchemy,Python,Flask,Celery,Flask Sqlalchemy,我正在使用Flask、芹菜、Redis和Mysql建立网站。现在我面临一个问题。我想将每个SQL查询发送到芹菜,一旦完成任务,我就会从芹菜中获得查询结果。 以下是我的部分代码: Manage.py import os from app import create_app, db from app.models import Users, Items from flask.ext.script import Manager, Shell from flask.ext.migrate import
import os
from app import create_app, db
from app.models import Users, Items
from flask.ext.script import Manager, Shell
from flask.ext.migrate import Migrate, MigrateCommand
app = create_app(os.getenv('FLASK_CONFIG') or 'default')
app.app_context().push()
manager = Manager(app)
migrate = Migrate(app, db)
def make_shell_context():
return dict(app=app, db=db, Users=Users, Items=Items)
manager.add_command("shell", Shell(make_context=make_shell_context))
manager.add_command('db', MigrateCommand)
if __name__ == '__main__':
manager.run()
query.py
from .models import Items, Users
from sqlalchemy import desc
from app import create_celery_app
celery = create_celery_app()
@celery.task
def user_query(id):
return Users.query.filter_by(id = id).first()
view.py
from ..query import user_query
...
userresult = user_query.delay(1)
main.py
from flask import Blueprint
main = Blueprint('main', __name__)
from . import views, errors
app.py
from flask import Flask
from flask.ext.bootstrap import Bootstrap
from flask.ext.moment import Moment
from config import config, Config
from celery import Celery
from flask.ext.sqlalchemy import SQLAlchemy
import os
bootstrap = Bootstrap()
moment = Moment()
db = SQLAlchemy()
def create_app(config_name):
app = Flask(__name__)
app.config.from_object(config[config_name])
config[config_name].init_app(app)
bootstrap.init_app(app)
moment.init_app(app)
db.init_app(app)
from main import main as main_blueprint
app.register_blueprint(main_blueprint)
return app
def create_celery_app(app=None):
app = app or create_app(os.getenv('FLASK_CONFIG') or 'default')
celery = Celery(__name__, broker=app.config['CELERY_BROKER_URL'], include=['app.query'])
celery.conf.update(app.config)
TaskBase = celery.Task
class ContextTask(TaskBase):
abstract = True
def __call__(self, *args, **kwargs):
with app.app_context():
return TaskBase.__call__(self, *args, **kwargs)
celery.Task = ContextTask
return celery
当我运行芹菜工人时,我得到错误:
File "/home/yx/Documents/flasky/venv/bin/celery", line 11, in <module>
sys.exit(main())
File "/home/yx/Documents/flasky/venv/local/lib/python2.7/site-packages/celery/__main__.py", line 30, in main
main()
File "/home/yx/Documents/flasky/venv/local/lib/python2.7/site-packages/celery/bin/celery.py", line 81, in main
cmd.execute_from_commandline(argv)
File "/home/yx/Documents/flasky/venv/local/lib/python2.7/site-packages/celery/bin/celery.py", line 770, in execute_from_commandline
super(CeleryCommand, self).execute_from_commandline(argv)))
File "/home/yx/Documents/flasky/venv/local/lib/python2.7/site-packages/celery/bin/base.py", line 309, in execute_from_commandline
argv = self.setup_app_from_commandline(argv)
File "/home/yx/Documents/flasky/venv/local/lib/python2.7/site-packages/celery/bin/base.py", line 469, in setup_app_from_commandline
self.app = self.find_app(app)
File "/home/yx/Documents/flasky/venv/local/lib/python2.7/site-packages/celery/bin/base.py", line 489, in find_app
return find_app(app, symbol_by_name=self.symbol_by_name)
File "/home/yx/Documents/flasky/venv/local/lib/python2.7/site-packages/celery/app/utils.py", line 229, in find_app
sym = symbol_by_name(app, imp=imp)
File "/home/yx/Documents/flasky/venv/local/lib/python2.7/site-packages/celery/bin/base.py", line 492, in symbol_by_name
return symbol_by_name(name, imp=imp)
File "/home/yx/Documents/flasky/venv/local/lib/python2.7/site-packages/kombu/utils/__init__.py", line 96, in symbol_by_name
module = imp(module_name, package=package, **kwargs)
File "/home/yx/Documents/flasky/venv/local/lib/python2.7/site-packages/celery/utils/imports.py", line 101, in import_from_cwd
return imp(module, package=package)
File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "/home/yx/Documents/flasky/app/query.py", line 6, in <module>
celery = create_celery_app()
File "/home/yx/Documents/flasky/app/__init__.py", line 29, in create_celery_app
app = app or create_app(os.getenv('FLASK_CONFIG') or 'default')
File "/home/yx/Documents/flasky/app/__init__.py", line 24, in create_app
from main import main as main_blueprint
File "/home/yx/Documents/flasky/app/main/__init__.py", line 5, in <module>
from . import views, errors
File "/home/yx/Documents/flasky/app/main/views.py", line 7, in <module>
from ..query import user_query
ImportError: cannot import name user_query
文件“/home/yx/Documents/flasky/venv/bin/芹菜”,第11行,在
sys.exit(main())
文件“/home/yx/Documents/flasky/venv/local/lib/python2.7/site packages/cellery/_main__.py”,第30行,在main中
main()
文件“/home/yx/Documents/flasky/venv/local/lib/python2.7/site packages/cellery/bin/cellery.py”,第81行,主视图
cmd.从命令行(argv)执行命令
文件“/home/yx/Documents/flasky/venv/local/lib/python2.7/site packages/celery/bin/celery.py”,第770行,从命令行执行
超级(CeleryCommand,self)。从命令行(argv)执行命令)
文件“/home/yx/Documents/flasky/venv/local/lib/python2.7/site packages/芹菜/bin/base.py”,第309行,从命令行执行
argv=self.setup\u app\u from\u命令行(argv)
文件“/home/yx/Documents/flasky/venv/local/lib/python2.7/site packages/芹菜/bin/base.py”,第469行,安装程序应用程序中,来自命令行
self.app=self.find_应用程序(app)
文件“/home/yx/Documents/flasky/venv/local/lib/python2.7/site packages/芹菜/bin/base.py”,第489行,在find_应用程序中
返回find\u app(app,symbol\u by\u name=self.symbol\u by\u name)
文件“/home/yx/Documents/flasky/venv/local/lib/python2.7/site packages/芹菜/app/utils.py”,第229行,在find_应用程序中
sym=symbol按名称(应用程序,imp=imp)
文件“/home/yx/Documents/flasky/venv/local/lib/python2.7/site-packages/cellery/bin/base.py”,第492行,符号为
按名称返回符号(名称,imp=imp)
文件“/home/yx/Documents/flasky/venv/local/lib/python2.7/site packages/kombu/utils/___init__.py”,第96行,符号为“按名称”
模块=imp(模块名称,包=包,**kwargs)
文件“/home/yx/Documents/flasky/venv/local/lib/python2.7/site packages/芹菜/utils/imports.py”,第101行,从cwd导入
返回imp(模块,包=包)
文件“/usr/lib/python2.7/importlib/_init_uuu.py”,第37行,在导入模块中
__导入(名称)
文件“/home/yx/Documents/flasky/app/query.py”,第6行,在
芹菜=创建芹菜应用程序()
文件“/home/yx/Documents/flasky/app/_____________.py”,第29行,在创建芹菜应用程序中
app=app或create_app(os.getenv('FLASK_CONFIG')或'default')
文件“/home/yx/Documents/flasky/app/__init__.py”,第24行,在创建应用程序中
从main导入main作为main\u蓝图
文件“/home/yx/Documents/flasky/app/main/_init__.py”,第5行,在
从…起导入视图、错误
文件“/home/yx/Documents/flasky/app/main/views.py”,第7行,在
from..query导入用户\u查询
ImportError:无法导入名称用户\u查询
但是用户查询来自query.py,所以有人知道我是否遗漏了什么吗?
谢谢。如果您从视图返回结果,使用芹菜不会带来任何好处。这看起来不像芹菜问题,而是
views.py
中的导入问题。将导入更改为from.query导入用户\u query
@dirn我只是在view.py中调用delay。所以你的意思是我应该在query.py?@jumbopp中返回结果,我刚刚更新了view.py,您可以看到原始from语句。如果我不吃芹菜,这就行了,所以我很困惑你为什么要这么做?芹菜用于后台任务,提交请求的人不需要/不期望即时响应。如果您从视图返回结果,使用芹菜不会给您带来任何好处。这看起来不像芹菜问题,而是views.py
中的导入问题。将导入更改为from.query导入用户\u query
@dirn我只是在view.py中调用delay。所以你的意思是我应该在query.py?@jumbopp中返回结果,我刚刚更新了view.py,您可以看到原始from语句。如果我不吃芹菜,这就行了,所以我很困惑你为什么要这么做?芹菜是用于后台任务的,提交请求的人不需要/期望即时响应。