справка / предложения по html-форме python-flask

#python #html #forms #flask #http-status-code-400

#python #HTML #формы #flask #http-status-code-400

Вопрос:

Я создаю страницу для пользователей, чтобы они могли просматривать объявления на практическом сайте. На странице «обзор» у меня есть три отдельные формы, две из которых представляют собой поля выбора, а другая — текстовое поле. Поля выбора позволяют пользователю изменять местоположение или тип транзакции, а текстовое поле позволяет им изменять то, что они ищут. Я хотел сделать этот чистый HTML и не использовать flask-wtf. Я успешно получил ту часть, где они могут менять местоположение, но как только я добавляю код для других параметров, он прерывается, и я получаю ошибку 400 bad request. Любые предложения или рекомендации относительно того, почему это не работает, когда я добавляю формы для изменения типа элемента и транзакции?

  @app.route('/find-it/', methods=['GET','POST'])
def browse():
   try:

    location = session.get('location', None)
    transType = session.get('transType', None)
    item = session.get('item', None)        

    data = browseQuery()

     if request.method == 'POST':
        if request.form['changeLocation'] != '':
            print('location changed')
            location = request.form['changeLocation']
            session['location'] = location
            return redirect(url_for('browse', location=location))
        elif request.form['changeType'] != '':
            print('type changed')
            transType = request.form['changetype']
            session['transType'] = transType
            return redirect('browse', transType=transType)
        else:
            if request.form['changeItem'] != '':
                print('item changed')
                item = request.form['changeItem']
                session['item'] = item
                return redirect(url_for('browse', item=item))

      return render_template('all-classifieds.html',location=location,transType=transType, data=data)
except Exception as e:
    return (str(e))
  

HTML:

 <form method="post" id="changeLocation" name="changeLocation" action="">

                    <select name="changeLocation" id="changeLocation" style="margin-right: 5%; float: left;">
                        <optgroup label="Where?">
                            <option selected style="display:none;color:#eee;"></option>
                            <option>option 1</option>
                            <option>option 2</option>

                        </optgroup></select></form>


<button type="submit" id="submit" form="changeLocation" style="padding: 0 3px; float:left;"
                        class="btn btn-info btn-sm">
                    <i class="glyphicon glyphicon-search"></i>
                </button>




 <form method="post" name="changeType" id="changeType">


                    <select name="changeType" id="changeType" style="margin-right: 5%; float: left;">
                        <optgroup label="...">
                            <option selected style="display:none;color:#eee;"></option>
                            <option>option 1</option>
                            <option>option 2</option>
                            <option>option 3</option>

                        </optgroup>
                    </select>



<form method="post" name="changeType" id="changeType">


                    <select name="changeType" id="changeType" style="margin-right: 5%; float: left;">
                        <optgroup label="Look for things that are...">
                            <option selected style="display:none;color:#eee;"></option>
                            <option>asdf</option>
                            <option>asdfasdf</option>
                            <option>asdfasdfasdf</option>

                        </optgroup>
                    </select></form>

<button type="submit" id="submit" form="changeType" style="padding: 0 3px; float:left;"
                        class="btn btn-info btn-sm">
                    <i class="glyphicon glyphicon-search"></i>
                </button>


<form method="post" name="changeItem" id="changeItem">
                    <input type="text" name="changeItem" value="" id="changeItem" placeholder=""/>
                </form>

<button type="submit" id="submit" form="changeItem" style="padding: 0 3px; float:left;"
                        class="btn btn-info btn-sm">
                    <i class="glyphicon glyphicon-search"></i>
                </button>
  

Комментарии:

1. Почему бы вам не использовать debug=True, тогда вы увидите, какова фактическая ошибка?

2. настолько новичок в этом. У меня есть debug=True. не уверен, как его использовать, я думаю? @DanielRoseman я не получаю страницу обратной трассировки. при отправке на странице просто указывается 400 неверных запросов, и это все

3. Есть ли у вас код для обработки загрузки страницы при получении GET запроса? Я вижу здесь код POST , есть ли что-то еще, чего вы не показываете?

4. Я только что добавил еще пару строк, которые я пропустил, но это не должно иметь значения. То, что выше, — это все, что у меня есть @coralv

Ответ №1:

Проблема, о которой вы спрашивали:

С помощью

 if request.form['changeLocation'] != '':
  

вероятно, вы пытаетесь выяснить, использовалась ли эта конкретная форма. Проблема в том, что при использовании правильной формы эта проверка работает, но если использовалась другая форма request.form , словарь выдает ошибку ключа. Но это не нормально KeyError . Flask переведет эту «специальную» ошибку в a 400 Bad Request .

Чтобы проверить, присутствует ли определенный ключ в данных формы, используйте in оператор

 if "changeLocation" in request.form:
    # you can use request.form["changeLocation"] here
elif "changeType" in request.form:
    # here request.form["changeType"] is present
...
  

Еще одна проблема:

Эта строка

 render_template('all-classifieds.html',location=location,transType=transType, data=data)
  

не будет работать, потому location что и transType определены в if блоках. Произойдет сбой, если блоки не будут выполнены.

Что-то другое:

 else:
    if condition:
         do_something
  

может быть переписан как

 elif condition:
    do_something
  

Комментарии:

1. Спасибо, @Wombatz