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

2016-05-26 17:12:58 +08:00
 yamada

我用 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)
4626 次点击
所在节点    Python
13 条回复
cloverstd
2016-05-26 17:42:43 +08:00
貌似 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
2016-05-26 18:08:52 +08:00
跑正式服务器试试。
yamada
2016-05-26 18:11:59 +08:00
单线程也不应该这样啊,感觉和单线程没关系
我目前还不知道怎么部署正式服务器,也没有正式服务器,现在只是在自己开发的时候发现这种问题,不知道是什么原因
yamada
2016-05-26 18:12:41 +08:00
@cloverstd
单线程也不应该这样啊,感觉和单线程没关系

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

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


@Zzzzzzzzz 晚点试试

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


@Aether 具体和开发环境有什么不同导致这个问题?晚点试试
DoctorCat
2016-05-27 01:06:46 +08:00
return resp 打个断点,然后看下生成验证码时耗时(代码段执行期间的耗时),反复生成几次,对比下这段时间耗时
kxxoling
2016-05-27 12:04:07 +08:00
@yamada 你先看一下是哪一段代码比较费时?
yamada
2016-05-27 16:07:43 +08:00
@kxxoling 就 def v()这段,你跑下看看……
yamada
2016-05-27 21:18:07 +08:00
又碰到一个奇怪的问题,在公司电脑一切 OK ,在家里电脑运行,刷新任何页面几次以后会卡死, chrome 一直在转圈,加上 threaded=True 就好了,比较迷……

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

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

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

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

© 2021 V2EX