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
yamada
V2EX  ›  Python

flask 入门,渲染页面时快时慢的问题

  •  
  •   yamada · 2016-05-26 17:12:58 +08:00 · 4625 次点击
    这是一个创建于 3133 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我用 flask ,就一行渲染页面的代码,渲染的页面也基本纯 html 没有其他的东西,没有外链,为什么有时候要几百毫秒来渲染,多刷新几下又只需要几十毫秒,再刷新又变回几百毫秒反复,对于一个输出验证码图片的接口调用更是一快一慢很有规律……以下是我的代码:

    from flask import Flask,Blueprint,redirect,url_for,render_template,send_file,make_response,session
    from io import BytesIO
    import random
    import string
    from wheezy.captcha.image import *
    
    home = Blueprint("home",__name__)
    
    @home.route("/")
    def index():
        return render_template("home/index.html")
    
    
    @home.route("/v")
    def v():
        captcha_image = captcha([background(),
            text(fonts=['arial.ttf'],
                 font_sizes=[46],
                drawings=[warp(),
                    rotate(),
                    offset()]),
            curve(),
            noise(),
            smooth()],150,45)
        vcode = random.sample(string.ascii_letters + "".join([str(x) for x in range(0,10)]),4)
        image = captcha_image(vcode)
        out = BytesIO()
        image.save(out, 'jpeg', quality=20)
        image.close()
        out.seek(0)
        resp = make_response(send_file(out,"image/jpeg"))
        resp.headers["cache-control"] = "no-cache"
        session["vcode"] = "".join(vcode)
        return resp
    
    if __name__ == '__main__':
        import os
        HOST = os.environ.get('SERVER_HOST', 'localhost')
        try:
            PORT = int(os.environ.get('SERVER_PORT', '5555'))
        except ValueError:
            PORT = 5555
        app.debug = True
        app.run(HOST, PORT)
    
    第 1 条附言  ·  2016-05-27 17:58:11 +08:00
    又碰到一个奇怪的问题,在公司电脑一切 OK ,在家里电脑运行,访问几次以后会卡死, chrome 一直在转圈,加上 threaded=True 就好了,比较迷……
    13 条回复    2016-05-27 21:18:07 +08:00
    cloverstd
        1
    cloverstd  
       2016-05-26 17:42:43 +08:00   ❤️ 2
    貌似 Flask 自带的 server 默认是单线程的,你试试 app.run(host="0.0.0.0", port=8080, threaded=True)

    http://flask.pocoo.org/docs/0.10/api/#flask.Flask.run
    http://werkzeug.pocoo.org/docs/0.11/serving/#werkzeug.serving.run_simple
    Aether
        2
    Aether  
       2016-05-26 18:08:52 +08:00
    跑正式服务器试试。
    yamada
        3
    yamada  
    OP
       2016-05-26 18:11:59 +08:00
    单线程也不应该这样啊,感觉和单线程没关系
    我目前还不知道怎么部署正式服务器,也没有正式服务器,现在只是在自己开发的时候发现这种问题,不知道是什么原因
    yamada
        4
    yamada  
    OP
       2016-05-26 18:12:41 +08:00
    @cloverstd
    单线程也不应该这样啊,感觉和单线程没关系

    @Aether
    我目前还不知道怎么部署正式服务器,也没有正式服务器,现在只是在自己开发的时候发现这种问题,不知道是什么原因

    你们有这种现象吗?
    Aether
        5
    Aether  
       2016-05-26 18:14:23 +08:00
    @yamada
    有。
    上正式环境再测试。
    kxxoling
        6
    kxxoling  
       2016-05-26 18:25:18 +08:00
    Jinja2 有缓存的,我的页面初次渲染大概是 120ms ,之后每次只需要 10ms 左右。
    Zzzzzzzzz
        7
    Zzzzzzzzz  
       2016-05-26 18:37:10 +08:00
    werkzeug 有个 ProfilerMiddleware, 加载一下看看输出
    Kilerd
        8
    Kilerd  
       2016-05-26 18:42:42 +08:00
    debug 模式慢其实很正常, 生产环境用 gunicorn 和 gevent 的话 会好很多。
    yamada
        9
    yamada  
    OP
       2016-05-26 18:52:47 +08:00 via Android
    @kxxoling 我多刷新几次又变几百毫秒了,再刷新又变几十毫秒,反复如此,期间什么都没做,缓存被 jinja2 清掉了?我输出图片一快一慢如何解释都没渲染模板


    @Zzzzzzzzz 晚点试试

    @Kilerd 这是不是慢的有点不合理?而且不是一直这么慢一快一慢试过关掉 debug 无用


    @Aether 具体和开发环境有什么不同导致这个问题?晚点试试
    DoctorCat
        10
    DoctorCat  
       2016-05-27 01:06:46 +08:00
    return resp 打个断点,然后看下生成验证码时耗时(代码段执行期间的耗时),反复生成几次,对比下这段时间耗时
    kxxoling
        11
    kxxoling  
       2016-05-27 12:04:07 +08:00
    @yamada 你先看一下是哪一段代码比较费时?
    yamada
        12
    yamada  
    OP
       2016-05-27 16:07:43 +08:00
    @kxxoling 就 def v()这段,你跑下看看……
    yamada
        13
    yamada  
    OP
       2016-05-27 21:18:07 +08:00
    又碰到一个奇怪的问题,在公司电脑一切 OK ,在家里电脑运行,刷新任何页面几次以后会卡死, chrome 一直在转圈,加上 threaded=True 就好了,比较迷……
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1255 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 17:54 · PVG 01:54 · LAX 09:54 · JFK 12:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.