Flask RESTful create_app с использованием проблемы сельдерея - PullRequest
0 голосов
/ 10 декабря 2018

Я новичок в Python Flask RESTful API.Теперь проект, над которым я работаю, был предварительно построен из предыдущих разработчиков.Я могу добавить больше логики в этот проект.Теперь, когда требования идут, мне нужно использовать CELERY для обширных расчетов.Я просматривал различные статьи в сети (например, https://blog.miguelgrinberg.com/post/celery-and-the-flask-application-factory-pattern) и другие статьи здесь, но все еще не повезло с этим.

[repo: tracker/]
   __init.py__
   app.py
   config.py
   models.py
   celery.py
   tasks.py
   /resources/locate.py
   /resources/create.py

init .py - имеет следующее содержание:

from tracker import app

app.py - имеет следующее содержимое:

from tracker.resources.locate import Locate
from tracker.resources.create import Create

from .celery import create_celery
from .redis_repo import redis_store
from .config import app_config
from .models import db

import collections

def create_app(config_name):

    app = Flask(__name__)
    app.config.from_object(app_config[config_name])

    api = Api(app, catch_all_404s=True)
    api.add_resource(Locate, '/api/v1/locate/<string:ud>', methods=['GET'])
    api.add_resource(Create, '/api/v1/create/<string:ud>', methods=['GET','POST'])

    redis_store.init_app(app)
    db.init_app(app)

       return app

    app = create_app('development')

    if __name__ == '__main__':
        app.run(threaded=True, debug=False)

config.py - имеет следующее содержимое:

import tempfile

class DevelopmentConfig(Config):
    DEBUG = True
    SQLALCHEMY_POOL_SIZE = 10
    SQLALCHEMY_DATABASE_URI = 'postgres://xxx'
    REDIS_URL = "redis://127.0.0.1:32769/0" 
    CELERY_BROKER_URL = "redis://127.0.0.1:32769/0"
    CELERY_BACKEND = "db+postgresql://xxx" 

app_config = {'development': DevelopmentConfig}

models.py -имеет следующее содержимое:

from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import func, exc, or_
import datetime
from sqlalchemy_utils import UUIDType

import tracker

db = SQLAlchemy()

class T_Logs(db.Model)
      ....
      ....
      ....    

locate.py - имеет следующее содержимое:

from flask import request, current_app, jsonify, after_this_request
from flask_restful import Resource
from sqlalchemy import exc

from tracker import models, config, redis_repo, utility
from datetime import datetime, timedelta

import uuid, json

class Locate(Resource):

    def get(self, ud):
    ....
    ....    

Используя эти документы или руководства, довольно легко запустить и понять, как это работает.в целом, добавив его в наши реализации, он, кажется, не работает.

с celery.py

from celery import Celery

def create_celery(app=None):
    application = app or create_app
    celery = Celery(app.import_name,
                    broker=app.config['CELERY_BROKER_URL'])
    celery.conf.update(app.config)
    TaskBase = celery.Task

    class ContextTask(TaskBase):
        abstract = True

        def __call__(self, *args, **kwargs):
            with application.app_context():
                return TaskBase.__call__(self, *args, **kwargs)

    celery.Task = ContextTask
    return celery

и примером tasks.py

from app import create_celery

@celery.task(name="tasks.add")
def add(a,b):
    return a+ b

Поэтому, когда я запускаю этис помощью кода Visual Studio я не вижу никаких ошибок или предупреждений. Но когда я запускаю это в другой командной строке, чтобы запустить рабочий:

celery -A app.tasks.add worker -l info -P eventlet

Это говорит из tracker.resources.locate import Locate ModuleNotFoundError: Нетмодуль с именем 'tracker'

Он никогда не будет выполнен. Я неИ еще пытаюсь назвать задачи по ресурсам, но я пока не могу понять, как это сделать.

Если кто-нибудь сможет просветить меня этим, это будет очень признательно.

1 Ответ

0 голосов
/ 11 декабря 2018

Мне удалось решить проблему, похоже, проблема на абсолютном пути.

, поэтому внесены некоторые соответствующие изменения, такие как:

try:
   from tracker.resources.locate import Locate
except ImportError:
   from resources.locate import Locate

И так с другим импортомЗаявления.

Теперь моя следующая проблема: как я могу вызвать задачу, скажем, внутри метода Locate Route в GET.1011 *

...