2015-06-19 2 views
1

Я новичок в колбе. Я пытался применить post/redirect/get pattern для своей программы. Вот что я сделал.Как обнаружить ошибки в POST-запросе (колбу)?

В index.html

{% block page_content %} 
<div class="container"> 
    <div class="page-header"> 
     <h1>Hello, {% if user %} {{ user }} {% else %} John Doe {% endif %}: {% if age %} {{ age }} {% else %} ?? {% endif %}</h1> 
    </div> 
</div> 
    {% if form %} 
    {{wtf.quick_form(form)}} 
    {% endif %} 
{% endblock %} 

В views.py

class NameForm(Form): 
    age = DecimalField('What\'s your age?', validators=[Required()]) 
    submit = SubmitField('Submit') 

'''''' 
@app.route('/user/<user>', methods=['GET', 'POST']) 
def react(user): 
    session['user'] = user 
    form = NameForm() 
    if form.validate_on_submit(): 
     old_age = session.get('age') 
     if old_age != None and old_age != form.age.data: 
      flash('age changed') 
      session['age'] = form.age.data 
     return redirect(url_for('react', user = user)) 
    return render_template('index.html', user = user, age = session.get('age'), form = form, current_time = datetime.utcnow()) 

запрос GET обрабатывается хорошо, когда я открыть xxxx:5000/user/abc. Однако запрос POST не выполняется. Я получаю ошибку 404. Я думаю, что функция url_for может дать неправильное значение redirect. Как я могу проверить значение, возвращаемое url_for?

У меня ошибка 405, когда я пытался использовать базу данных. На этот раз я понятия не имею.

@app.route('/search', methods=['GET', 'POST']) 
def search(): 
    form = SearchForm() # a StringField to get 'name' and SubmitField 
    if form.validate_on_submit(): 
     person = Person.query.filter_by(name = form.name.data) # Person table has two attributes 'name' and 'age' 
     if person is None: 
      flash('name not found in database') 
     else: 
      session['age'] = person.age 
      return redirect(url_for('search')) 
    return render_template('search.html', form = form, age = session.get('age'), current_time = datetime.utcnow()) 

Есть ли удобный способ для отладки при сбое запроса POST?

+1

Запустите приложение в [режиме отладки] (http://flask.pocoo.org/docs/0.10/quickstart/#debug-mode). – nathancahill

+0

@nathancahill python run.py runningerver --host 0.0.0.0 --debug Это то, что я сделал. – LeonF

ответ

1

Проблема не в url_for(), это так, как вы используете wtf.quick_form(). Посмотрите на форму генерируемого кода:

<form action="." method="post" class="form" role="form"> 

action="." строка сообщает браузеру, чтобы взять информацию, предоставленную и отправить его в URL .. Период (.) означает «текущий каталог». Итак, что происходит, вы нажимаете кнопку «Отправить», а затем ваши POST-сообщения в браузере до localhost:5000/users/. Флажок видит этот запрос /users/ и не может его обслуживать, потому что /users/ недействительный URL. Вот почему вы получаете 404.

К счастью, это можно исправить. В index.html, попробуйте позвонить quick_form() и переходящая в действии:

{{wtf.quick_form(form, action=url_for('react', user=user))}} 

Теперь ваша форма оказывается так:

<form action="/user/abc" method="post" class="form" role="form"> 

и ваш браузер знает, чтобы отправить форму /user/abc, который является действительным URL, поэтому Flask обработает его.

Вы не разместили свой код для search.html, но попробуйте применить ту же логику выше к этому шаблону; надеюсь, это исправит проблему!

+0

Большое спасибо !. Ваш. Где я могу найти '

'? Выполняет ли 'url_for ('response', user = user)' '{{wtf.quick_form (form, action = url_for ('response', user = user)}}}'? Фактически, вчера я написал функцию «реагировать», и она работала хорошо. Сегодня он провалился после того, как я внес некоторые изменения. – LeonF

+0

1. Элемент '' находится на отображаемой странице. Перейдите по адресу http: // localhost: 5000/user/abc, затем щелкните правой кнопкой мыши на странице и нажмите «Источник страницы просмотра» (это можно назвать «источником просмотра»). 2. Короче говоря, нет, они не то же самое. 'url_for()' - это функция Python, которая возвращает строку, которая является URL-адресом для функции ([см. здесь] (http://flask.pocoo.org/docs/0.10/api/#flask.url_for)). 'wtf.quick_form()' является макросом Jinja2, который отображает форму ([см. здесь] (https: // github.ком/MBR/Колба-самозагрузки/блоб/ведущий/flask_bootstrap/шаблоны/самозагрузки/wtf.html # L131)). –

Смежные вопросы