如何在Flask中获取图像的安全URL?

时间:2018-04-15 16:50:42

标签: python python-3.x image flask flask-sqlalchemy

我已将所有图片存储在 \ uploads 文件夹中。我在文件夹中存储了文件名+扩展名。每张图片的名称都为 PHOTO_ID.jpeg 。我有一些关于项目的问题以及我通过其ID连接照片的项目。我想发送包含图像url的JSON响应。

通缉回复: json:{name: 'somename' url: 'imageURL'}

所以问题是如何获取只能从一个用户访问的网址。我不想让任何人能够猜出其他人的网址形象。 我在FLASK中找到了一些方法,但它们需要绑定到某个端点。我不想要显式端点来检索图像的网址。 到目前为止我发现的这些方法:

send_from_directory(DIRECTORY,FILENAME)
url_for(endpoint, filename=filename)
send_file(FILEPATH,'image/' + extension, as_attachment=True)

我想要像retrieve_url(FILEPATH)这样简单的东西,它只会为一个用户返回网址和安全方法。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

我看到了几种方法

1)不要使用可预测的文件名,而是使用一些长的随机字符串保存文件,并将其链接到数据库中的原始文件名

2)为静态图像制作自定义路线,并且只有在验证用户有权访问时才发送图像:

@app.route('/send_file/<path:filename>')
def send_file(filename):
    image = Photo.query.filter_by(user_id=session['user_id'], filename=filename).first()
    if  image:
        return send_from_directory('image_folder', filename)
    else:
        return 'not allowed/found'

3将图像作为二进制数据发送到JSON中(更多数据+不优雅),请参阅here

答案 1 :(得分:0)

如果您有基于会话的用户管理系统,请创建一个身份验证令牌(任意随机字符串/使用bcrypt根据某些会话信息生成加密令牌)将其存储在您的数据库/会话中。

对于您的图片,请执行以下操作:

@app.route('/downloads/<auth_token>/<filename>')
def downloads(auth_token, filename):
    if session['auth_token'] == str(auth_token):
        return send_from_directory(app.config['UPLOAD_FOLDER'], filename)
    return 'You are not allowed to view this page'

加密的会话令牌对该特定会话的特定用户有效。如果auth_token不匹配,则该URL上将无法访问该文件。