Я получаю ошибку Bad Request при отправке формы в flask - PullRequest
0 голосов
/ 29 января 2020

Итак, моя форма выглядит следующим образом

<form action="{{ url_for('addnote') }}">
                Notatka: <input type="text" name="note" placeholder="Notatka">
                <br><br>
                <input onclick="document.getElementById('receiver').disabled ^= true;" type="checkbox" checked> Do wszystkich?
                <br><br>
                <input type="text" name="receiver" id="receiver" placeholder="Adresat" disabled="false" value="">
                <br><br>
                <input type="hidden" name="author" value="{{ current_user.username }}">
                <input type="submit" name="action" value="Dodaj notatke">
            </form>

И моя функция в flask в этот момент у меня есть только это:

def addnote():
    note=request.form['note']
    author=request.form['author']
    receiver=request.form['receiver']
    return "whatever"

Позже я хотел бы сделать что-то с эти данные, но даже с таким небольшим количеством кода, я получаю плохую ошибку запроса. Я искал решение, но не могу найти ничего, что поможет в моем случае

Ответы [ 3 ]

0 голосов
/ 29 января 2020

Возможно, вы захотите посмотреть Flask WTForms. WTForms - отличное расширение Flask, которое прекрасно справляется с этим. Это выглядело бы примерно так с использованием WTForms:

                           <div class="form-group">
                                {{ form.myField.label(class="form-control-label") }} {% if form.myField.errors %} {{ form.myField(class="form-control
                                form-control-lg is-invalid") }}
                                <div class="invalid-feedback">
                                    {% for errors in form.myField.errors %}
                                    <span>{{ error }}</span>
                                    {% endfor %}
                                </div>
                                {% else %} {{ form.myField(class="form-control form-control-lg") }} {% endif %}
                            </div>

                         <form action="http://127.0.0.1:5000/addnote" method="post">

                             <input type="submit" class="btn btn-outline-info" name="submit_button" value="Retrieve Data">

                         </form>

А на стороне сервера было бы что-то вроде:

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField, BooleanField, SelectField
from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationError

class ToolForm(FlaskForm):
    myField = StringField('Enter Data', validators=[DataRequired()])

@app.route('/addnote', methods=['GET', 'POST'])
def addnote():
    form = ToolForm()

    if request.method == 'POST':
         if request.form['submit_button'] == 'Retrieve Data':
             x = form.myField.data
0 голосов
/ 29 января 2020

Хорошо, поэтому я не хотел использовать flask_wtf, но я нашел способ обойти эту проблему. Вместо использования author=request.form['author'] я делаю author=request.form.get('author'). Я не уверен, что на самом деле было причиной проблемы, но так это работает.

0 голосов
/ 29 января 2020

Ваша форма не имеет атрибута method="post", поэтому по умолчанию она будет иметь значение get, что приведет к появлению пар ключ / значение URL (например, /addnote?note=x&receiver=...)

Также убедитесь, что ваш маршрут прослушивает ПОСТ:

@app.route('/addnote', methods=['GET', 'POST'])
def addnote():
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...