Python Flask - Bad Request 浏览器(或代理)发送了一个该服务器无法理解的请求

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/48780324/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-19 18:51:32  来源:igfitidea点击:

Flask - Bad Request The browser (or proxy) sent a request that this server could not understand

pythonmongodbflaskpymongo

提问by Roxas Zohbi

I'm trying to do a file upload & enter data task into my MongoDB using flask but I had this error when I filled my form & upload the image:

我正在尝试使用flask上传文件并将数据任务输入到我的MongoDB中,但是当我填写表单并上传图像时出现此错误:

Bad RequestThe browser (or proxy) sent a request that this server could not understand.

Bad Request浏览器(或代理)发送了一个该服务器无法理解的请求。

my HTML code

我的 HTML 代码

    <form class="form-check form-control" method="post" enctype="multipart/form-data" action="{{ url_for('index') }}">      
          <label>Full Name*</label></td>
          <input name="u_name" type="text" class="text-info my-input" required="required" />
          <label>Email*</label>
          <input name="u_email" type="email" class="text-info my-input" required="required" />
          <label>Password*</label>
          <input name="u_pass" type="password" class="text-info my-input" required="required" />
          <label>Your Image*</label>
          <input name="u_img" type="file" class="text-info" required="required" /></td>
          <input name="btn_submit" type="submit" class="btn-info" />
    </form>

& my python code:

&我的python代码:

from flask import Flask, render_template, request, url_for
from flask_pymongo import PyMongo
import os
app = Flask(__name__)
app.config['MONGO_DBNAME'] = 'flask_assignment'
app.config['MONGO_URI'] = 'mongodb://<user>:<pass>@<host>:<port>/<database>'
mongo = PyMongo(app)
app_root = os.path.dirname(os.path.abspath(__file__))


@app.route('/', methods=['GET', 'POST'])
def index():
    target = os.path.join(app_root, 'static/img/')
    if not os.path.isdir(target):
        os.mkdir(target)
    if request.method == 'POST':
        name = request.form['u_name']
        password = request.form['u_pass']
        email = request.form['u_email']
        file_name = ''
        for file in request.form['u_img']:
            file_name = file.filename
            destination = '/'.join([target, file_name])
            file.save(destination)
        mongo.db.employee_entry.insert({'name': name, 'password': password, 'email': email, 'img_name': file_name})
        return render_template('index.html')
    else:
        return render_template('index.html')

app.run(debug=True)

回答by Oluwafemi Sule

The error there is resulting from a BadRequestKeyErrorbecause of access to a key that doesn't exist in request.form.

那里的错误是BadRequestKeyError由于访问了不存在于request.form.

ipdb> request.form['u_img']
*** BadRequestKeyError: 400 Bad Request: The browser (or proxy) sent a request that this server could not understand.

Uploaded files are keyed under request.filesand not request.formdictionary. Also, you need to lose the loop because the value keyed under u_imgis an instance of FileStorageand not iterable.

上传的文件被键入request.files而不是request.form字典。此外,您需要丢失循环,因为键入的值u_img是 的实例FileStorage而不是iterable

@app.route('/', methods=['GET', 'POST'])
def index():
    target = os.path.join(app_root, 'static/img/')
    if not os.path.isdir(target):
        os.makedirs(target)
    if request.method == 'POST':
        ...
        file = request.files['u_img']
        file_name = file.filename or ''
        destination = '/'.join([target, file_name])
        file.save(destination)
        ...
    return render_template('index.html')