如何将数据和 POST 有效负载作为表单数据加密到 Flask App 端点

How to Encrypt Data and POST payload as form data to Flask App endpoint

我正在关注这个 tutorial for encrypting and decrypting data with the Python cryptography package and this 非常相似,但不包括通过 Internet 将数据发送到 http 服务器,我很想知道如何做到这一点。教程是关于使用 Fernet 密钥作为加密方法。

所以下面的这段代码正在读取时间序列数据的 CSV 文件,并且 加密部分工作得很好 它只是如何我将其打包为表单数据? Pandas 读取 CSV,到 json,然后我想对数据字节进行加密,是否可以将其打包为表单 POST 到 HTTP Python Flask 应用程序端点?

此代码在下面运行良好,直到它到达 POST 加密数据的 requests.post 部分:

import pandas as pd
import requests
import time
from cryptography.fernet import Fernet


df = pd.read_csv('event_schedule.xlsx', index_col='Time Block',parse_dates=True)

print(df)

post_this_data = df.to_json(orient="index")
print(post_this_data)


file = open('secret.key','rb')
key = file.read()
file.close()


fernet = Fernet(key)
encrypted=fernet.encrypt(post_this_data.encode())
print('Encrypted Success')
encrypted_list = list(encrypted)

r = requests.post('http://192.168.0.105:5000/update/data', data=encrypted_list)
print(r.text)

追溯是:

Traceback (most recent call last):
  File "C:\Users\bbartling\OneDrive - Slipstream\Desktop\event_schedule\postingScriptEncrypted.py", line 26, in <module>
    r = requests.post('http://10.200.200.223:5000/update/data', data=encrypted_list)
  File "C:\Python39\lib\site-packages\requests\api.py", line 119, in post
    return request('post', url, data=data, json=json, **kwargs)
  File "C:\Python39\lib\site-packages\requests\api.py", line 61, in request
    return session.request(method=method, url=url, **kwargs)
  File "C:\Python39\lib\site-packages\requests\sessions.py", line 528, in request
    prep = self.prepare_request(req)
  File "C:\Python39\lib\site-packages\requests\sessions.py", line 456, in prepare_request
    p.prepare(
  File "C:\Python39\lib\site-packages\requests\models.py", line 319, in prepare
    self.prepare_body(data, files, json)
  File "C:\Python39\lib\site-packages\requests\models.py", line 510, in prepare_body
    body = self._encode_params(data)
  File "C:\Python39\lib\site-packages\requests\models.py", line 97, in _encode_params
    for k, vs in to_key_val_list(data):
TypeError: cannot unpack non-iterable int object

如果您希望将加密数据作为表单数据发送,您需要将其作为字典发送,其中实际加密数据是一个值。

encrypted = fernet.encrypt(post_this_data.encode())
payload = {'encrypted_data': encrypted}
r = requests.post('http://192.168.0.105:5000/update/data', data=payload)

然后在您的 Flask 端点端:


from flask import Flask, request

app = Flask(__name__)


@app.route('/update/data', methods=['POST'])
def index():
    encrypted_data = request.form['encrypted_data']
    # decrypt encrypted_data

或者,您也可以考虑将加密数据作为原始请求正文发送:

encrypted = fernet.encrypt(post_this_data.encode())
r = requests.post('http://192.168.0.105:5000/update/data', data=encrypted)

然后在您的 Flask 端点端:


from flask import Flask, request

app = Flask(__name__)


@app.route('/update/data', methods=['POST'])
def index():
    encrypted_data = request.get_data()
    # decrypt encrypted_data