Python 使用Flask上载拒绝超过一定数量的文件?
Flask建议使用Flask上载模块来处理上载。我想拒绝任何超过一定大小的文件。有几种解决方案: : 此外,您还可以使用patch_request_类对应用程序的request_类进行修补,使其具有最大上载大小 : MAX_CONTENT_LENGTH是拒绝文件上载的正确方法,文件上载的大小超出了您的需要 -或Python 使用Flask上载拒绝超过一定数量的文件?,python,file-upload,flask,flask-uploads,Python,File Upload,Flask,Flask Uploads,Flask建议使用Flask上载模块来处理上载。我想拒绝任何超过一定大小的文件。有几种解决方案: : 此外,您还可以使用patch_request_类对应用程序的request_类进行修补,使其具有最大上载大小 : MAX_CONTENT_LENGTH是拒绝文件上载的正确方法,文件上载的大小超出了您的需要 -或 我没有看到官方文档中提到的MAX\u CONTENT\u LENGTH,也没有像帖子那样手动检查文件大小。这两种方法最终是相同的,还是存在(大/小)差异?另外,patch\u reque
我没有看到官方文档中提到的
MAX\u CONTENT\u LENGTH
,也没有像帖子那样手动检查文件大小。这两种方法最终是相同的,还是存在(大/小)差异?另外,patch\u request\u class
是先将文件保存到磁盘以确定总上载大小,还是将其保存到内存?MAX\u CONTENT\u LENGTH
是0.6版中引入的烧瓶本身的配置项
默认情况下,Flask将愉快地接受文件上传到无限制的服务器
内存量,但您可以通过设置
最大内容长度配置键:
from flask import Flask, Request
app = Flask(__name__)
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024
上述代码将最大允许有效负载限制为16
兆字节。如果传输较大的文件,Flask将引发
RequestEntityTooLarge异常
此功能添加到烧瓶0.6中,但可以在较旧的烧瓶中实现
通过对请求对象进行子类化,也可以创建版本。更多
有关这方面的信息,请查阅Werkzeug文件
处理
并从烧瓶上传源:
因此,我要说的是:
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024
patch\u request\u class
只是为了向后兼容
从Flask 0.6开始,您应该使用app.config['MAX\u CONTENT\u LENGTH']
我最近接手了Flask Uploads项目的维护工作,我做的第一件事就是在中删除
patch\u request\u类
,因为它只会给新项目增加混乱。任何依赖它的旧项目都应该在它们的requirements.txt
文件中锁定Flask Uploads==0.1.3
。所以patch\u request\u class
只是为了向后兼容?你已经接受了!检查大小限制。垃圾带。
# save to memory, then check filesize
blob = request.files['file'].read()
size = len(blob)
from flask import Flask, Request
app = Flask(__name__)
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024
def patch_request_class(app, size=64 * 1024 * 1024):
"""
By default, Flask will accept uploads to an arbitrary size. While Werkzeug
switches uploads from memory to a temporary file when they hit 500 KiB,
it's still possible for someone to overload your disk space with a
gigantic file.
This patches the app's request class's
`~werkzeug.BaseRequest.max_content_length` attribute so that any upload
larger than the given size is rejected with an HTTP error.
.. note::
In Flask 0.6, you can do this by setting the `MAX_CONTENT_LENGTH`
setting, without patching the request class. To emulate this behavior,
you can pass `None` as the size (you must pass it explicitly). That is
the best way to call this function, as it won't break the Flask 0.6
functionality if it exists.
.. versionchanged:: 0.1.1
:param app: The app to patch the request class of.
:param size: The maximum size to accept, in bytes. The default is 64 MiB.
If it is `None`, the app's `MAX_CONTENT_LENGTH` configuration
setting will be used to patch.
"""
if size is None:
if isinstance(app.request_class.__dict__['max_content_length'],
property):
return
size = app.config.get('MAX_CONTENT_LENGTH')
reqclass = app.request_class
patched = type(reqclass.__name__, (reqclass,),
{'max_content_length': size})
app.request_class = patched
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024