werkzeug.exceptions.BadRequestKeyError尝试使用Flask从get请求获取.csv文



我正试图从表单中获取.csv文件,在服务器上获取它,打开它并让nummers返回有效的文件,但当我试图从请求中打开文件时,我会得到"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 = "teln"
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()

我已经3天没有开始使用Python和Flask了,所以plz,没有判断:D

flaskrequest.files机制假设请求将是POST,因为不可能通过GET请求上传文件(您可以获取文件的数据,但这与*不同(。

因此,表单的方法属性应该是POST,并且它还应该将属性enctype设置为"POST";多部分/形式数据";绝对正确。

<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 = "teln"
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处理表单数据。

最新更新