小编tza*_*azo的帖子

Flask - 上传到 S3/Google Cloud 时是否需要使用 secure_filename()?

在文件上传的 Flask 文档中,他们建议在存储文件之前使用 来secure_filename()清理文件的名称。

\n\n

这是他们的例子:

\n\n
uploaded_file = request.files[\'file\']\nif uploaded_file:\n    filename = secure_filename(uploaded_file.filename) # <<<< note the use of secure_filename() here\n    file.save(os.path.join(app.config[\'UPLOAD_FOLDER\'], filename))\n    return redirect(url_for(\'display_file\',\n                            filename=filename))\n
Run Code Online (Sandbox Code Playgroud)\n\n

文档说:

\n\n
\n

现在的问题是,有一个名为\xe2\x80\x9cnever trust user\n input\xe2\x80\x9d 的原则。对于上传文件的文件名也是如此。所有提交的表单数据都可以伪造,并且文件名可能很危险。目前请记住:在将文件名直接存储到文件系统之前,始终使用该函数来保护文件名。

\n
\n\n

对于异地存储(S3 或 Google Cloud),我不会使用 Flask 将文件存储在 Web 服务器上。相反,我将重命名上传文件(使用我自己的 UUID),然后将其上传到其他地方。

\n\n

例子:

\n\n
blob = bucket.blob(\'prompts/{filename}\'.format(filename=uuid.uui4()))\nblob.upload_from_string(uploaded_file.read(), content_type=uploaded_file.content_type)\n
Run Code Online (Sandbox Code Playgroud)\n\n

在这种情况下,我认为您不需要先调用,对吗secure_filename()

\n\n

似乎因为我(a)将文件的内容读入字符串,然后(b)使用我自己的文件名,所以我的用例不易受到目录遍历或流氓命令类型攻击(例如),但"../../../../home/username/.bashrc"我\我不是100%确定。

\n

werkzeug flask

6
推荐指数
1
解决办法
1万
查看次数

将变量附加到 app 与 Flask 中的 current_app 相同吗?

与这个问题类似,我想在整个 Flask 应用程序(所有请求)之间共享一个变量。

我正在编译一个大数据文件(相当大的开销),并且希望尽可能少地进行编译 - 将结果存储在变量中,以便以后可以访问它。使用将flask.g不起作用,因为它在请求之间被擦除干净。

六年前,Armin Ronacher(Flask 的创建者)在Reddit 帖子中说道:

您可以将其附加到应用程序对象并通过 访问它 flask.current_app.whatever_variable

这是我的两个问题:

A) 这仍然是推荐的做法吗?

B) 这两种方法(附加到应用程序工厂current_appapp应用程序工厂内部)是否等效?

使用current_app

from flask import current_app
current_app.my_var = <<file>>
Run Code Online (Sandbox Code Playgroud)

使用应用程序工厂

def create_app(config_filename):
    app = Flask(__name__)
    app.config.from_pyfile(config_filename)
    app.my_var = <<file>>
    ...
    return app
Run Code Online (Sandbox Code Playgroud)

python flask

6
推荐指数
1
解决办法
1367
查看次数

无法在 Flask 中设置表单数据的默认值

我有一个 Flask 路线,定义如下:

@app.route('/test/', methods=['POST'])
def test():
    number = request.form.get('my_number', 555) # number == ''
    return str(number)
Run Code Online (Sandbox Code Playgroud)

/test/如果我向空/缺失发出 POST 请求my_number,我希望将局部变量number设置为555(默认值)。相反,number是一个空字符串''

我能够获得受尊重的默认值()的唯一方法是像这样number == 555使用:or

@app.route('/test/', methods=['POST'])
def test():
    number = request.form.get('my_number') or 555 # number == 555
    return str(number)
Run Code Online (Sandbox Code Playgroud)

知道出了什么问题吗?

python flask

4
推荐指数
1
解决办法
5323
查看次数

标签 统计

flask ×3

python ×2

werkzeug ×1