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 · 5931 次点击
    这是一个创建于 2578 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在一个 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   ·   实用小工具   ·   2763 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:43 · PVG 22:43 · LAX 07:43 · JFK 10:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.