2017-04-24 55 views
1

我在这里提到的链接:More than one static path in local Flask instance,并试图让显示在浏览器选项卡中的图像文件,但不能这样做。无法排除错误。 stored_name是存储在由app config常量变量指定的路径中的文件的物理文件名:'UPLOAD_FOLDER'。 此文件夹不在静态文件夹及其子文件夹路径中。我想增加文件(也可能是图像文件)的存储容量,稍后添加硬盘空间,如果我使用静态文件夹存储,这很困难。我不希望应用程序初始化(工作)瓶子api中的自定义静态路径?

代码片段中重写静态文件夹:

从瓶进口send_from_directory

@app.route('/api/v1.0/docs/<path:filename>', methods=["GET"]) 
def img_render(filename): 
    print 'Called here' 
    return send_from_directory(app.config['UPLOAD_FOLDER'], filename) 


@app.route('/api/v1.0/docs/<int:doc_id>',methods=["GET"]) 
def image_rendering(doc_id): 
    s = select([docs]).where(docs.c.id==doc_id) 
    rs = conn.execute(s).fetchone() 
    filename = str(rs[docs.c.stored_name]) 

    return url_for('img_render', filename=filename) 

HTML模板:

<!DOCTYPE html> 
<html> 
    <body> 
    <img src="{{url_for('img_render', filename=filename) }}" /> 
    </body> 
</html> 

的模板在模板文件夹中。如果我的应用程序的初始化过程覆盖原来的静态文件夹,我能够获得在浏览器中显示的图像,但我不得不改变我的参考应用程序的静态文件夹OR我会上传图片到静态文件夹从应用程序,我不想做的什么是错误的,它只是显示图像的浏览器例如路径:

/api/v1.0/docs/1_20160707_121214.jpg

,而不是图像本身?代码中的错误在哪里?使用烧瓶v0.11,linux 2.7。

回答

1

image_rendering方法返回一个字符串(这是你在浏览器中看到的)时,它应该返回一个模板渲染的结果。

替换“mytemplate.html”具有下列样品在HTML模板的名称。

from flask import render_template 

@app.route('/api/v1.0/docs/<int:doc_id>',methods=["GET"]) 
def image_rendering(doc_id): 
    s = select([docs]).where(docs.c.id==doc_id) 
    rs = conn.execute(s).fetchone() 
    filename = str(rs[docs.c.stored_name]) 

    return render_template('mytemplate.html', filename=filename) 

这是一个简单的Flask应用程序在Windows中工作。在我的d:\ temp文件夹中有一个文件test.jpg。确保您的Flask应用程序具有正确的权限来读取上传文件夹中的文件。要通过浏览http://127.0.0.1:5000/api/v1.0/docs/99:在templates文件夹

from flask import Flask, send_from_directory, render_template 

app = Flask(__name__) 
app.config['UPLOAD_FOLDER'] = 'd:/temp' 


@app.route('/') 
def hello_world(): 
    return 'Hello World!' 


@app.route('/api/v1.0/docs/<path:filename>', methods=["GET"]) 
def img_render(filename): 
    return send_from_directory(app.config['UPLOAD_FOLDER'], filename=filename, mimetype='image/jpeg') 


@app.route('/api/v1.0/docs/<int:doc_id>',methods=["GET"]) 
def image_rendering(doc_id): 
    # ignore doc_id, we'll use a constant filename 
    filename = 'test.jpg' 
    return render_template('test.html', filename=filename) 


if __name__ == '__main__': 
    app.run() 

的test.html:

<!DOCTYPE html> 
<html> 
    <body> 
    <img src="{{url_for('img_render', filename=filename) }}" /> 
    </body> 
</html> 
+0

我已经尝试了上面也。它只是显示缩略图,而不是实际的图像。 – user956424

+0

在你的'img_render'函数中,不是打印'在这里调用',而是打印传递给函数的文件名,即'打印文件名'。这是图像的预期名称吗? – pjcunningham

+0

是的,我得到的文件名正确 – user956424