请教 Flask 离线程序中如何利用上下文传递 g 和 request 参数

2020-12-08 10:10:14 +08:00
 luxiaoer

现状: 原钉钉发送消息是同步程序,发送钉钉消息程序中有记录 Flask 程序运行日志,日志包含当前请求用户信息,和请求参数信息。

问题:Flask 调用 Celery,Celery 执行程序后发送钉钉消息,钉钉消息程序中记录日志。

概要代码如下

# __init__.py
def create_app():
    ....
    return app

# mycelery.py
def make_celery(app):
    celery = Celery(__name__, broker=celeryconfig.broker_url, backend=celeryconfig.result_backend)
    celery.config_from_object(celeryconfig)
    class ContextTask(celery.Task):
        def __call__(self, *args, **kwargs):
            with app.app_context():
                return self.run(*args, **kwargs)            
    celery.Task = ContextTask
    return celery


app = Flask(__name__)
celery_app = make_celery(app)


# celery_task.py
@celery_app.task(bind=True,ignore_result=True,max_retries=5)
def celery_stock_sync(self,**kwargs):
    pass


# dd_utils.py
from record_log import run_log
def send_dd_msg():
    res = dd_sdk.request()
    run_log(res)
    pass


# record_log.py
def run_log():
    # 这里需要记录当前操作的用户信息,以及用户请求信息
    user_id = g.get('user_id',None)
    method= request.method
    pass


3006 次点击
所在节点    Python
28 条回复
luxiaoer
2020-12-08 15:31:00 +08:00
@no1xsyzy
好的,谢谢
nthhdy
2020-12-08 15:38:59 +08:00
传 g 和 request 不合理,同意 @echowuhao 的方法
Cookieeeeee
2020-12-08 19:34:41 +08:00
把具体的信息取出来 celery 里头上下文和 flask 里头不一样 传对象取不到值
Cookieeeeee
2020-12-08 19:35:36 +08:00
或者序列化下传进去解耦
goxy
2020-12-08 22:04:11 +08:00
需要理解一下 context 的概念

Celery 和 Flask 都是独立设计的,你可以理解为两个职业不同的人在一起协同工作,A 要分配任务给 B,是需要通过发一份邮件之类的东西给 B,而不是把 A B 缝起来让他们成为连体婴儿。g 和 request 都是设计在 flask 内部的,对于 celery 是透明的,而开发上要做的是设计这样一份 邮件
cz5424
2020-12-08 22:24:08 +08:00
启动任务把参数传进去就好了,不要用全局,他们都是互相独立的进程
cz5424
2020-12-08 22:26:04 +08:00
不要觉得 g 和上下文变量很酷,声明多了你都不知道声明了多少个全局变量。
luxiaoer
2020-12-10 10:16:49 +08:00
感谢以上的提醒,已经用了 3 楼的思路重写中。
重写一半又准备重写了,准备把日志记录功能拆解到 Celery 中做异步日志记录😂
每次都不想重写,然鹅一次次重写
@Cookieeeeee
@goxy
@cz5424

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/733193

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX