在POST上提交表单:' 405方法不允许'

时间:2017-07-20 13:53:20

标签: python forms flask flask-wtforms

您好我对烧瓶应用感到困惑。我有一条路线/ to welcomepage生成ux_uuid然后将其传递给表单。现在,在我提交表单后,我希望传递ID(ux_uuid)。但是,在所有情况下(form.validate==false或者即使一切都没问题)它最终会出现405错误 - 不允许使用方法。 methods=['GET','POST']['POST']方法,所以我不明白为什么if request.method == 'POST'会中断?

app.py:

import logging, os
from flask import Flask, json, make_response, render_template, request, session, redirect, url_for, jsonify
from ux.forms import QuestionForm
from flask_wtf.csrf import CSRFProtect
import sqlite3

app = Flask(__name__,  static_url_path='')
app.secret_key = "NSA secret key"

csrf = CSRFProtect()
csrf.init_app(app)

@app.route('/', methods=['GET', 'POST'])
def welcomepage():
    # Here is the random user ID generated by some random function but 
    # can be set to some string to test:
    ux_uuid = 'TETST_ID' #or set this to ux_uuid='TestUserID'
    return render_template('welcomepage.html', ux_uuid=ux_uuid)

@app.route('/form1/<ux_uuid>', methods=['GET', 'POST'])
def form1(ux_uuid):

    form = QuestionForm()

    if request.method == 'POST':
        if form.validate() == False:
            print("VALIDATE ME !")
            return render_template('/form1.html/<ux_uuid>', form=form, ux_uuid=ux_uuid)
        else:
            #
            #mylist = json.dumps(form.first_question)
            print('I STORED ALL THE FORM DATA IN THE SQLITE3 DB here - and GO ON TO:')
            return render_template('signup.html', ux_uuid=ux_uuid)

    elif request.method == 'GET':
        return render_template('form1.html', form=form, ux_uuid=ux_uuid)

    return render_template('form1.html')


# turn on debug=true to see error messages
if __name__ == "__main__":
    app.run(debug=True)

这是/ux/forms.py:

from flask_wtf import Form
from wtforms import SelectMultipleField, SubmitField, RadioField
from wtforms.validators import DataRequired, Email, Length

class QuestionForm(Form):
    first_question = SelectMultipleField('What is your favourite food? Select all that apply:', choices=[('pizza','pizza'), ('more pizza', 'more pizza'), ('burger', 'burger'), ('salad', 'salad'), ('fries', 'fries'), ('pasta', 'pasta')], validators=[DataRequired()])
    second_question = RadioField('How many coins do you have?', choices=[('0','0'), ('1-5','1-5'), ('5-10','5-20'), ('More than 20', 'More than 20')], validators=[DataRequired()])
    third_question = RadioField('Do you like chocolate?', choices=[('Yes', 'Yes'), ('No', 'No')], validators=[DataRequired()])
    submit = SubmitField('Submit & Continue')

和form1.html:

<!DOCTYPE html>
<html>
  <head>
    <title>PREVIOUS EXPERIENCE</title>
  </head>
  <body>
    <main class="container signup-section">
      <div class="section-content">
        <h2>Please Answer the following questions</h2>

        <form method="POST" action="/form1">
          {{ form.hidden_tag() }}

          <div class="form-group">
            {{ form.first_question.label }}

            {% if form.first_question.errors %}
              {% for error in form.first_question.errors %}
                <p class="error-message">{{ error }}</p>
              {% endfor %}
            {% endif %}

            {{ form.first_question }}
          </div>

          <div class="form-group">
            {{ form.second_question.label }}

            {% if form.second_question.errors %}
              {% for error in form.second_question.errors %}
                <p class="error-message">{{ error }}</p>
              {% endfor %}
            {% endif %}

            {{ form.second_question }}
          </div>

          <div class="form-group">
            {{ form.third_question.label }}

            {% if form.third_question.errors %}
              {% for error in form.third_question.errors %}
                <p class="error-message">{{ error }}</p>
              {% endfor %}
            {% endif %}

            {{ form.third_question }}
          </div>

          {{ form.submit(class="btn-primary") }}
        </form>
      </div>
      <p>ID TEST:</p>
      {{ ux_uuid }}
    </main>
  </body>
</html>

和欢迎页面:

<!DOCTYPE html>
<html>
  <head>
    <title>WELCOMEPAGE</title>
  </head>
  <body><p> ENTRY PAGE / START WELCOME </p>
  <a href="{{url_for('form1', ux_uuid=ux_uuid)}}" class="btn btn-default">Continue</a></body>
</html>

以下是要测试的所有文件:stack.zip

0 个答案:

没有答案