72967


flaskアプリでアップロードされたcsvファイルを読み込み、それをDataFrameに変換し、別のurlに送るかそのままダウンロードできるようにしたいです。現在は以下のようなコードでやっていますが、csvファイルをアップロードした時点で

[code]

    Bad Request
    The browser (or proxy) sent a request that this server could not understand.
    
[/code]

という表示が出てしまいます。どうにかできる方法を教えていただきたいです。

[code]

    UPLOAD_FOLDER = '/intern/upload'
    ALLOWED_EXTENSIONS = {'csv'}
    
    app = Flask(__name__)
    app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
    
    def allowed_file(filename):
        return '.' in filename and \
               filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
    
    #忘れたらflaskの公式見ればある
    @app.route('/', methods=['GET', 'POST'])
    def upload_file():
        if request.method == 'POST':
            # check if the post request has the file part
            if 'file' not in request.files:
                flash('No file part')
                return redirect(request.url)
            file = request.files['file']
            # if user does not select file, browser also
            # submit an empty part without filename
            if file.filename == '':
                flash('No selected file')
                return redirect(request.url)
            if file and allowed_file(file.filename):
                file=request.files['input_files']
                tempfile_path = tempfile.NamedTemporaryFile().name
                file.save(tempfile_path)
                df1=pd.read_csv(tempfile_path)
                return redirect(url_for('hello',
                                    filename=df1))
    
[/code]

* * *

追記

HTMLの部分について追記させていただきます。HTMLの部分は

[code]

    @app.route('/', methods=['GET', 'POST'])
    def upload_file():
        if request.method == 'POST':
    
[/code]

のifに対してのreturnとして以下のようにしています。

[code]

    return '''
        <!doctype html>
        <title>Upload new File</title>
        <h1>Upload new File</h1>
        <form method=post enctype=multipart/form-data>
          <input type=file name=file>
          <input type=submit value=Upload>
        </form>
        '''
    
[/code]

ダウンロードの部分は以下のようにしております。最終的に(/getPlotCSV)の方のcsvを'unfinished'ではなく、uploadの方で編集したDataFrameを変換したcsvに変えたいと考えております。

[code]

    @app.route('/hello')
    
    def hello():
        return '''
            <html><body>
            Hello. <a href="/getPlotCSV">Click me.</a>
            </body></html>
            '''
    
    @app.route("/getPlotCSV")
    def getPlotCSV():
        # with open("outputs/Adjacency.csv") as fp:
        #     csv = fp.read()
        csv = 'unfinished'
        return Response(
            csv,
            mimetype="text/csv",
            headers={"Content-disposition":
                     "attachment; filename=myanswer.csv"})
    
[/code]


CC BY-SA 4.0
2020-12-26T03:11:06.093
72897
2020-12-29T11:55:16.927
2020-12-28T11:42:16.217
43286
43286
question
python flask python-requests
flaskのアップロードされたcsvファイルを別のプログラムにつなげたい


ここです！！

[code]

    file=request.files['input_files']
    
[/code]

ここを削除すれば動くはずです！せっかくすでに

[code]

    file = request.files['file']
    
[/code]

で正しいファイルを取得しているにもかかわらず存在していないキー名で再取得しようとしているのが原因でした。

* * *

### 以下追加で直したほうがよいところ

  1. HTML の要素名は「"（ダブルクォーテーション）」で囲まなければいけません。なので 
[code]    <form method="post" enctype="multipart/form-data">

    
[/code]

と書きましょう。

  2. Python 内で使っている `file` という変数名は一般的すぎるのでもう少し説明的な名前がよいでしょう。また、Python 2.x では `file` という組み込み関数があったことからエディタでのシンタックスハイライトが効いてしまうなど混乱を招いてしまいます。`upload_file` などにしてみてはどうでしょう。


CC BY-SA 4.0
2020-12-29T11:55:16.927
72967
2020-12-29T11:55:16.927
39645
72897
answer