Python 如何使用芹菜运行SQL并从DB获取返回的结果?

Python 如何使用芹菜运行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

我正在使用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 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语句。如果我不吃芹菜,这就行了,所以我很困惑你为什么要这么做?芹菜是用于后台任务的,提交请求的人不需要/期望即时响应。