Flask项目与clery实践

好久没写博客了,前段时间换工作天天加班,最近不加班了长时间不写就不想写了,今天先凑合一篇,主要记录一下现在公司的项目实践。之前项目一直用Django框架,现在的公司都用flask,于是新项目也用flask搭建的。

项目结构

├── app
│   ├── __init__.py
│   ├── api
│   │   ├── __init__.py
│   │   ├── serializers       # 存放参数检验的目录
│   │   │   ├── __init__.py
│   │   ├── urls.py           # flask-rest的url映射
│   │   └── views             # 存放视图函数的目录
│   │       ├── __init__.py
│   │       ├── hello.py
│   ├── cache                 # 缓存函数目录
│   │   ├── __init__.py
│   ├── db                    # 数据库目录
│   │   ├── __init__.py
│   │   └── mongo.py
│   ├── service               # 公共服务目录
│   │   ├── __init__.py
│   │   └── email.py
│   ├── tasks                 # celery任务目录
│   │   ├── __init__.py
│   └── utils                 # 公共组件目录
│       ├── __init__.py
└── tests
|    └── __init__.py
├── .env                      # 环境变量文件
├── config.py
├── Dockerfile
├── Pipfile
├── Pipfile.lock
├── docker-compose.yml
├── manage.py                 # flask启动文件
├── readme.md

Celery

官方文档有介绍:

http://flask.pocoo.org/docs/1.0/patterns/celery/

在此基础上我将make_celery放到了app/__init__.py中。

# app/__init__.py
from flask import Flask
from config import config
from celery import Celery


def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)

    from .api import api as api_blueprint
    app.register_blueprint(api_blueprint, url_prefix='/doubao-uecv2/api/v1')

    return app


def make_celery(app):
    celery = Celery()
    celery.config_from_object(app.config)
    class ContextTask(celery.Task):
        def __call__(self, *args, **kwargs):
            with app.app_context():
                return self.run(*args, **kwargs)

    celery.Task = ContextTask
    return celery
# manage.py
import os
from dotenv import load_dotenv

dotenv_path = os.path.join(os.path.dirname(__file__), '.env')
if os.path.exists(dotenv_path):
    load_dotenv(dotenv_path)

from app import create_app, make_celery

app = create_app(os.getenv('FLASK_CONFIG') or 'default')

celery = make_celery(app)

自定义celery的task目录

class Config:
    ...
    CELERY_IMPORTS = ('app.tasks', )
    ...

然后在app/tasks/__init__.py中将各个task导入。

总结

啊啊啊,大晚上的了不想写了,架子也睡半个月前搭建的了,现在也组织不起语言来,就简单写写吧。其实写项目的话还是django好使我觉得,不用装那么多插件或者自己造轮子,也可能是我用的少的缘故,像django的中间件flask有各种handle,但用起来比较别扭,有时候一些功能不知道该放到目录的什么位置。还有日志配置也踩了半天坑。但是如果只是写着玩,一两个功能用flask一个文件几行代码就可以搞定,很方便。当然flask也适合大的项目,只不过前期搭架子得多花些时间。