栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用Flask中的隐藏字段_method更改请求方法

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用Flask中的隐藏字段_method更改请求方法

正如您已经指出的那样,您的中间件使后面的内容为

request.form
空。这是因为
request.form
正在从类似文件的对象中读取。引用PEP
333

wsgi.input-
一个输入流(类似文件的对象),可以从中读取HTTP请求主体。(服务器或网关可以根据应用程序的请求按需执行读取,或者可以预先读取客户端的请求主体并将其缓存在内存中或磁盘上,或者使用任何其他技术来提供这种输入流,偏好)。

请注意,本段不会告诉我们这个“类似文件的对象”是否可以将指针重置为文件的开头。实际上,如果我们尝试以下应用程序:

from werkzeug.serving import run_simpledef app(environ, start_response):    start_response('200 OK', [('Content-Type', 'text/plain')])    yield str(dir(environ['wsgi.input']))run_simple('localhost', 5000, app)

它没有显示该文件对象具有

seek
方法的任何索引。

因此,您 可以做的
是将所有内容读取到一个名为的字节串中

data
,并替换
wsgi.input
BytesIO(data)
,确实有
seek
一种可以使用的方法。
这样做会带来一些缺点 ,最明显的是,保证所有上传的数据在传递给应用程序之前都已被完全读取到内存中。也许还有一些我不了解的 危险情况
,这就是为什么我从不冒险尝试在实际应用程序中进行以下操作的原因:

from werkzeug.formparser import parse_form_datafrom werkzeug.wsgi import get_input_streamfrom io import BytesIOclass MethodMiddleware(object):    """Don't actually do this. The disadvantages are not worth it."""    def __init__(self, app):        self.app = app    def __call__(self, environ, start_response):        if environ['REQUEST_METHOD'].upper() == 'POST': environ['wsgi.input'] = stream =      BytesIO(get_input_stream(environ).read()) formdata = parse_form_data(environ)[1] stream.seek(0) method = formdata.get('_method', '').upper() if method in ('GET', 'POST', 'PUT', 'DELETE'):     environ['REQUEST_METHOD'] = method        return self.app(environ, start_response)


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/659685.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号