Flask:如何获取动态生成的图像文件的URL?

9
from flask import Flask, redirect, url_for

app = Flask(__name__)
@app.route('/')
def index():
        generate_img("test.jpg");
        return '<img src=' + url_for(filename='test.jpg') + '>'

generate_img()函数会在当前目录(与此脚本相同的文件夹)生成一张随机图片。

我访问mydomain.com/test.jpg时出现了404错误,但是我没有找到该图片。

2个回答

8

404错误的原因是没有相应的视图来处理请求。要从Flask中提供图片,请将图片保存在static文件夹中,然后您可以通过以下URL访问该图片:

mydomain.com/static/test.jpg

     from flask import Flask, redirect, url_for

     app = Flask(__name__)
     @app.route('/')
     def index():
          generate_img("test.jpg"); #save inside static folder
          return '<img src=' + url_for('static',filename='test.jpg') + '>' 

静态文件夹用于提供所有的媒体资源,包括css、javascript、视频或图像文件,所有资源在mydomai.com/static/filename可访问。请记住,在生产环境中不应使用flask从静态文件夹提供服务。这个特性仅适用于开发环境。


那么对于生产环境,不要使用静态文件夹?你的意思是使用不同的文件夹名称吗? - KJW
你仍然可以使用静态文件夹,但必须设置 Apache 或你使用的任何服务器来从该文件夹加载媒体。否则,如果 Flask 继续自己提供服务,你可能会遇到性能问题。查看此博客文章的最后几行,了解如何为此设置 Apache http://manavgoel.net/blog/post/2012/7/Deploying-flask-website-on-webfaction - codecool

7
假设图像被实际生成(即调用了index()),导致404的原因是没有路由指向该图像,因此Flask会告诉您mydomain.com/test.jpg不存在。静态Web服务器(如Apache或Nginx)默认情况下将路径从根映射到URL,但普通的Flask / Werkzeug / WSGI设置不会这样做。
也许您想创建一个直接返回图像的资源?
编辑:类似的东西应该能够提供图像服务。
@app.route("/imgs/<path:path>")
def images(path):
    generate_img(path)
    fullpath = "./imgs/" + path
    resp = flask.make_response(open(fullpath).read())
    resp.content_type = "image/jpeg"
    return resp

编辑2:当然,generate_img可能可以重写,使其永远不会写入磁盘,而是直接返回图像数据。


1
如何创建直接返回图像的资源?那么在Flask中根本无法实现吗?我希望基本上可以从Flask服务器访问图像和文件。 - KJW
使用这个答案时要小心文件遍历攻击。 - ViolinFour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接