gpt4 book ai didi

python - 强制 Content-Type 或在 Flask 中公开 request.data 以获取已知内容类型

转载 作者:太空狗 更新时间:2023-10-29 21:55:42 28 4
gpt4 key购买 nike

我正在用 Python/Flask 重新创建服务,但遇到了现有客户端身份验证方式的问题。出于兼容性原因,我必须匹配现有的客户端方案。

现有客户端采用用户名、密码并对其进行 base64 编码。这不是 HTTP 基本身份验证,尽管听起来很相似。下面是一些创建此登录请求的示例代码。

credentials = {
'username': 'test@example.com',
'password': 'password'
}
data = b64encode(urlencode(credentials))
request = urllib2.Request(loginURL)
request.add_data(data)
# request.add_header('Content-Type', 'application/gooblygop')
# 'application/x-www-form-urlencoded' seems to be a default Content-Type
login = urllib2.urlopen(request)

在服务器端,我获取POST数据并对其进行base64解码,再次获取用户名和密码信息。

flask server:
@app.route('/login', methods=['POST'])
def login():
error = None
if request.method == 'POST':
# post data: cGFzc3dvcmQ9ZGVmYXVsdCZlbWFpbD10ZXN0JTQwZXhhbXBsZS5jb20=
data = b64decode(request.data)
# decoded data: password=default&email=test%40example.com
return('ok')

问题出在内容类型上。如果我在客户端 (application/gooblygop) 中指定了一个未知的 Content-Type,Flask 会将 POST 数据公开给 request.data 并且我可以解码 base64 字符串。如果我将 Content-Type 保留为默认值 (application/x-www-form-urlencoded),则原始数据不会暴露给 request.data,而且我不知道如何检索 base64 编码的字符串并使用它。

现有的客户端软件几乎都默认为 x-www-form-urlencoded,但我不能依赖这种情况。

本质上,我需要一种可靠的服务器端方法来访问该编码字符串,无论客户端程序声明什么 Content-Type。

其他注意事项:我是 Python 的新手,来自 PHP 背景。所以我非常愿意接受建议。此外,该项目主要供个人使用。

最佳答案

在处理具有正常 mime 类型的 urlencoded 帖子时,您想查看 request.form 对象。在这种情况下,您有一个不寻常的形式,但这里有一种方法可以做到这一点:

# mkreq.py
from urllib import urlencode
import urllib2
from base64 import b64encode

credentials = {
'username': 'test@example.com',
'password': 'password'
}
data = b64encode(urlencode(credentials))
request = urllib2.Request("http://localhost:5000/login")
request.add_data(data)
request.add_header('Content-Type', 'application/gooblygop')
# 'application/x-www-form-urlencoded' seems to be a default Content-Type
login1 = urllib2.urlopen(request).read()
print(login1)
request2 = urllib2.Request("http://localhost:5000/login")
request2.add_data(data)
login2 = urllib2.urlopen(request2).read()
print(login2)

您可能想修改登录位以检查 mime 类型,这里是对您当前设置进行最小更改的版本:

@app.route('/login', methods=['POST'])
def login():
error = None
if request.method == 'POST':
# post data: cGFzc3dvcmQ9ZGVmYXVsdCZlbWFpbD10ZXN0JTQwZXhhbXBsZS5jb20=
data = b64decode(request.data)
# decoded data: password=default&email=test%40example.com
if not data:
data = b64decode(request.form.keys()[0])
special_mimetype = request.mimetype
return(special_mimetype + '\n' + data)

这是第一个代码示例的输出,有两个请求:

bvm$ python mkreq.py
application/gooblygop
username=test%40example.com&password=password
application/x-www-form-urlencoded
username=test%40example.com&password=password

关于python - 强制 Content-Type 或在 Flask 中公开 request.data 以获取已知内容类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7086448/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com