werkzeug.exceptions.BadRequestKeyError当使用Flask从GET请求中获取.csv文件的时候

问题描述 投票:0回答:1

我试图从一个表单中获取一个.csv文件,在我的服务器上获取它,打开它并处理nunmers返回有效的,但当我试图从请求中打开文件时,我得到 "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。

python python-3.x csv flask werkzeug
1个回答
0
投票

烧瓶 request.files 机械假设请求是一个POST,因为不可能通过GET请求上传文件(你可以GET文件的数据,但这不完全是一回事*).

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

<form action="/api/listtels" method="POST" enctype="multipart/form-data">

在服务器端

  • 路由应该只接受POST请求。
  • 文件输入的名称并不构成了 request.args因此,成员资格测试应改为测试 request.files.
  • 上传的文件需要被解码并加载到一个缓冲区中,以便它可以由 csv.reader (也可以写到磁盘上再读回来)

    输入io

    @app.route('apilisttels', 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"
    

    返回 (ret)

* 你可以通过GET获取内容,或者将文件的内容粘贴到一个 <input type="textarea"...> 或在发送至服务器前用javascript操作表单数据。

© www.soinside.com 2019 - 2024. All rights reserved.