上传文件时,错误请求(400),Flask

时间:2016-03-26 08:26:02

标签: python html file-upload flask bad-request

我正在尝试将文件上传到我的Flask后端

我的Python代码

@app.route('/new_upload/', methods=['GET', 'POST'])
@login_required
def upload_file():

    file = request.files['file']
    if file and allowed_file(file.filename):
        filename = secure_filename(file.filename)
        file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
        flash("File uploaded: Thanks!", "success")
        return redirect(url_for('upload.html'))
    return render_template('upload.html', filename=filename)

我的HTML看起来像这样:

{% extends "layout.html" %}
{% from "macros.html" import render_field %}

{% block content %}
<form action="" method=post enctype=multipart/form-data>
      <p><input type=file name=file>
         <input type=submit value=Upload>
</form>
{% endblock %}

在主页上点击上传文件链接浏览器给我看

  

错误请求

     

浏览器(或代理)发送了此服务器无法发出的请求   理解。

清除主页HTML和图像附在下面

 <div class="main">

        <nav>

          <a href="{{ url_for('index') }}">All</a>

          {% if current_user.is_authenticated %}
          <a href="{{ url_for('stream', username=current_user.username) }}"> Following</a>
          <a href="{{ url_for('post') }}" class="new">Create New Post</a>
          <a href="{{ url_for('upload_file') }}" class="new">Upload file</a>
          {% endif %}

        </nav>

        {% block content %}{% endblock %}

      </div>

主页

enter image description here

点击

enter image description here

请尝试帮助我,我只是在学习

1 个答案:

答案 0 :(得分:2)

在这段代码中

return redirect(url_for('upload.html'))

您应该将url_for('upload.html')更改为url_for('upload')或者假设该函数的名称而不是html模板。

此外,如果您要对HTTP GET和HTTP POST请求使用相同的“def upload_file()”函数,那么您应该指定将在post上执行的代码段以及仅在仅执行时执行的另一段代码执行GET请求。类似的东西:

# Import request if you haven't.
from flask import request 

@app.route('/new_upload', methods=['GET', 'POST'])
@login_required
def upload_file():

    if request.method == 'POST':
        # This will be executed on POST request.
        file = request.files['file']
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            flash("File uploaded: Thanks!", "success")
            return redirect(url_for('upload_file'))

    # This will be executed on GET request.
    return render_template('upload.html')

我还没有测试过上面的代码,但如果你为GET和POST http请求使用一个函数,这应该是方法。 如果你没有区分上传功能(在POST HTTP请求上)和渲染模板(在GET请求上),它会尝试在每个请求上执行所有代码,并且会在循环中返回重定向(url_for('upload_file') )每次都不会返回render_template('upload.html'),其中假设显示页面(HTTP请求代码为200而不是代码400)。

您可以严格遵循以下示例: http://flask.pocoo.org/docs/0.10/patterns/fileuploads/获得全部想法。

您还可以查看HTTP方法:https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods,以便更好地了解POST和GET请求的内容。