werkzeug.exceptions.BadRequestKeyError 尝试使用 Flask 从 GET 请求中获取 .csv 文件时
werkzeug.exceptions.BadRequestKeyError While trying to get .csv file from a GET request using Flask
我正在尝试从表单中获取 .csv 文件,将其获取到我的服务器上,打开它并将数字视为 return 有效数字,但是当我尝试从我收到的请求 "werkzeug.exceptions.BadRequestKeyError"
我的html是这样的:
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title>Flask Tutorial</title>
</head>
<body>
<form action="/api/listtels" method="get">
<label for="tels">file:</label>
<input name="tels" type="file" id="tels"><br><br>
<input type="submit" value="send">
</form>
</body>
</html>
我的 python 代码是这样的:
import flask
import csv
from flask import Flask, render_template, request, jsonify
app = flask.Flask(__name__)
app.config["DEBUG"] = True
@app.route('/', methods=['GET'])
def home():
return render_template("home.html")
@app.route('/api/listtels', methods=['GET'])
def ltels():
tels = "ERROR"
ret = "ERROR"
if 'tels' in request.args:
tels = request.files['tels']
ret = "tel\n"
else:
return("\'tels\' arg is needed")
with open(tels, encoding='UTF-8') as f:
rows = csv.reader(f,delimiter=",",lineterminator="\n")
next(rows, None)
for row in rows:
tel = row[0]
tel = str(''.join(filter(str.isnumeric, tel)))
if len(tel) == 11:
ret = ret + tel + "\n"
elif len(tel) == 13:
ret = ret + "+" + tel + "\n"
return (ret)
app.run()
我开始使用 Python 和 Flask 已经 3 天了,所以请不要判断 :D
flask request.files
机器假定请求将是 POST,因为无法通过 GET 请求上传文件(您可以获取文件的数据,但这不是一回事*).
因此,为了绝对正确,表单的方法属性应该是 POST,而且它的属性 enctype
也应该设置为“multipart/form-data”。
<form action="/api/listtels" method="POST" enctype="multipart/form-data">
在服务器端
- 路由应该只接受 POST 个请求。
- 文件输入的名称不构成
request.args
的一部分,因此应将成员测试更改为测试 request.files
。
- 上传的文件需要解码并加载到缓冲区,以便
csv.reader
处理(或者可以写入磁盘然后读回)
import io
@app.route('/api/listtels', methods=['POST'])
def ltels():
tels = "ERROR"
ret = "ERROR"
# Check if the file is loaded
if 'tels' in request.files:
tels = request.files['tels']
ret = "tel\n"
else:
return("\'tels\' arg is needed")
# Load decoded file data into a text buffer
buf = io.StringIO(tels.read().decode('utf-8'))
rows = csv.reader(buf,delimiter=",",lineterminator="\n")
next(rows, None)
for row in rows:
tel = row[0]
tel = str(''.join(filter(str.isnumeric, tel)))
if len(tel) == 11:
ret = ret + tel + "\n"
elif len(tel) == 13:
ret = ret + "+" + tel + "\n"
return (ret)
* 您可以通过 GET 获取内容,方法是将文件的内容粘贴到 <input type="textarea"...>
或在发送前使用 javascript 处理表单数据到服务器。
我正在尝试从表单中获取 .csv 文件,将其获取到我的服务器上,打开它并将数字视为 return 有效数字,但是当我尝试从我收到的请求 "werkzeug.exceptions.BadRequestKeyError"
我的html是这样的:
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title>Flask Tutorial</title>
</head>
<body>
<form action="/api/listtels" method="get">
<label for="tels">file:</label>
<input name="tels" type="file" id="tels"><br><br>
<input type="submit" value="send">
</form>
</body>
</html>
我的 python 代码是这样的:
import flask
import csv
from flask import Flask, render_template, request, jsonify
app = flask.Flask(__name__)
app.config["DEBUG"] = True
@app.route('/', methods=['GET'])
def home():
return render_template("home.html")
@app.route('/api/listtels', methods=['GET'])
def ltels():
tels = "ERROR"
ret = "ERROR"
if 'tels' in request.args:
tels = request.files['tels']
ret = "tel\n"
else:
return("\'tels\' arg is needed")
with open(tels, encoding='UTF-8') as f:
rows = csv.reader(f,delimiter=",",lineterminator="\n")
next(rows, None)
for row in rows:
tel = row[0]
tel = str(''.join(filter(str.isnumeric, tel)))
if len(tel) == 11:
ret = ret + tel + "\n"
elif len(tel) == 13:
ret = ret + "+" + tel + "\n"
return (ret)
app.run()
我开始使用 Python 和 Flask 已经 3 天了,所以请不要判断 :D
flask request.files
机器假定请求将是 POST,因为无法通过 GET 请求上传文件(您可以获取文件的数据,但这不是一回事*).
因此,为了绝对正确,表单的方法属性应该是 POST,而且它的属性 enctype
也应该设置为“multipart/form-data”。
<form action="/api/listtels" method="POST" enctype="multipart/form-data">
在服务器端
- 路由应该只接受 POST 个请求。
- 文件输入的名称不构成
request.args
的一部分,因此应将成员测试更改为测试request.files
。 - 上传的文件需要解码并加载到缓冲区,以便
csv.reader
处理(或者可以写入磁盘然后读回)
import io
@app.route('/api/listtels', methods=['POST'])
def ltels():
tels = "ERROR"
ret = "ERROR"
# Check if the file is loaded
if 'tels' in request.files:
tels = request.files['tels']
ret = "tel\n"
else:
return("\'tels\' arg is needed")
# Load decoded file data into a text buffer
buf = io.StringIO(tels.read().decode('utf-8'))
rows = csv.reader(buf,delimiter=",",lineterminator="\n")
next(rows, None)
for row in rows:
tel = row[0]
tel = str(''.join(filter(str.isnumeric, tel)))
if len(tel) == 11:
ret = ret + tel + "\n"
elif len(tel) == 13:
ret = ret + "+" + tel + "\n"
return (ret)
* 您可以通过 GET 获取内容,方法是将文件的内容粘贴到 <input type="textarea"...>
或在发送前使用 javascript 处理表单数据到服务器。