在文件上传的 Flask 文档中,他们建议在存储文件之前使用 来secure_filename()清理文件的名称。
这是他们的例子:
\n\nuploaded_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))\nRun Code Online (Sandbox Code Playgroud)\n\n文档说:
\n\n\n\n\n现在的问题是,有一个名为\xe2\x80\x9cnever trust user\n input\xe2\x80\x9d 的原则。对于上传文件的文件名也是如此。所有提交的表单数据都可以伪造,并且文件名可能很危险。目前请记住:在将文件名直接存储到文件系统之前,始终使用该函数来保护文件名。
\n
对于异地存储(S3 或 Google Cloud),我不会使用 Flask 将文件存储在 Web 服务器上。相反,我将重命名上传文件(使用我自己的 UUID),然后将其上传到其他地方。
\n\n例子:
\n\nblob = bucket.blob(\'prompts/{filename}\'.format(filename=uuid.uui4()))\nblob.upload_from_string(uploaded_file.read(), content_type=uploaded_file.content_type)\nRun Code Online (Sandbox Code Playgroud)\n\n在这种情况下,我认为您不需要先调用,对吗secure_filename()?
似乎因为我(a)将文件的内容读入字符串,然后(b)使用我自己的文件名,所以我的用例不易受到目录遍历或流氓命令类型攻击(例如),但"../../../../home/username/.bashrc"我\我不是100%确定。
与这个问题类似,我想在整个 Flask 应用程序(所有请求)之间共享一个变量。
我正在编译一个大数据文件(相当大的开销),并且希望尽可能少地进行编译 - 将结果存储在变量中,以便以后可以访问它。使用将flask.g不起作用,因为它在请求之间被擦除干净。
六年前,Armin Ronacher(Flask 的创建者)在Reddit 帖子中说道:
您可以将其附加到应用程序对象并通过 访问它
flask.current_app.whatever_variable。
这是我的两个问题:
A) 这仍然是推荐的做法吗?
B) 这两种方法(附加到应用程序工厂current_app或app应用程序工厂内部)是否等效?
使用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) 我有一个 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)
知道出了什么问题吗?