如何得到 flask 中单个请求的唯一 ID? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
workwonder
V2EX    Python

如何得到 flask 中单个请求的唯一 ID?

  •  
  •   workwonder
    wonderbeyond 2017-10-11 19:40:10 +08:00 via Android 6408 次点击
    这是一个创建于 2974 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在一个 flask 应用里面,我输出了各种日志,以结构化形式存到 ElasticSearch,我想把每个日志都归属到具体的请求,以做到可以按请求追溯。应该怎么得到(或生成)一个请求的唯一 ID 呢?

    也就是说,用户请求一个地址,其处理过程中生成的一系列日志,和他下一次发起同样的请求所生成的日志,会归属到不同的请求 ID 上。
    13 条回复    2017-10-13 13:23:21 +08:00
    keysona
        1
    keysona  
       2017-10-11 19:44:01 +08:00
    我是直接 md5 当前的时间戳,取前面 16 位的。
    187j3x1
        2
    187j3x1  
       2017-10-11 19:49:55 +08:00
    uuid 啊,标准库
    everhythm
        3
    everhythm  
       2017-10-11 19:53:50 +08:00   1
    workwonder
        4
    workwonder  
    OP
       2017-10-11 19:56:52 +08:00 via Android
    @187j3x1 UUID 还得找时机生成并挂到 request 对象上,这个最早时机是什么时候?

    其实我想知道的是 flask 内部不同的 request 上下文是否有什么标识可以区分,比如 `id(request)` 或 `id(request.some_attr)` 是否可以。
    187j3x1
        5
    187j3x1  
       2017-10-11 19:59:59 +08:00
    @before_request 钩子放到 g
    g.uuid
    大概思路
    odirus
        6
    odirus  
       2017-10-11 20:01:31 +08:00   1
    分享一个其他方法,如果前面有 nginx 的话,

    nginx v1.11 支持 $request_id 变量;通过 proxy_set_header X-Request-Id $request_id 的方式把请求唯一 ID 写到 header 中

    在 flask 中通过获取头信息的方式即可
    workwonder
        7
    workwonder  
    OP
       2017-10-11 20:04:26 +08:00 via Android
    @odirus 多谢,通过 Nginx 是不错的方法,这样能和 Nginx 日志整合到一起来追溯。
    wellsc
        8
    wellsc  
       2017-10-11 20:19:34 +08:00 via iPhone
    @keysona hash 成 md5 要消耗时间性能的
    keysona
        9
    keysona  
       2017-10-11 20:36:56 +08:00
    @wellsc

    当初因为 uuid 太长了,就索性简单点自己生成了。
    iyaozhen
        10
    iyaozhen  
       2017-10-11 21:40:59 +08:00
    @workwonder 目前最佳实践是通过 nginx 生成,带到后端的同时返回给前端,方便问题定位。其实 request_id 还可以带上语义,比如说当前时间、机器 ip 等
    workwonder
        11
    workwonder  
    OP
       2017-10-11 21:43:04 +08:00 via Android
    @iyaozhen nice
    jyf
        12
    jyf  
       2017-10-12 15:46:40 +08:00   1
    你可以考虑用 xid 方案 比 uuid 短 可排序 带时间戳段位 机器应该能支持几百台规模 再多就不行了 当然你可以自己做个扩容实现
    workwonder
        13
    workwonder  
    OP
       2017-10-13 13:23:21 +08:00
    https://gist.github.com/wonderbeyond/ae7c27be9536d65966f5d94464df0d96

    实际需求很简单,我实现的也很简单。
    可为什么以 "flask request id" 为关键词找到的别的实现看起来有点复杂而且有点绕,或者完全不是一个意思:

    - https://pypi.python.org/pypi/flask-request-id-middleware/1.0
    - https://pypi.python.org/pypi/flask-request-id/0.1
    - https://github.com/Workable/flask-log-request-id
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1011 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 78ms UTC 22:57 PVG 06:57 LAX 14:57 JFK 17:57
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86