如何在 Flask 中修复 "The method is not allowed for the requested URL"

How to fix "The method is not allowed for the requested URL" in Flask

我正在尝试将经过身份验证的用户重定向到新的模板文件,但我每次都收到此 "The method is not allowed for the requested URL" 错误。

这是我的登录 Wtform 模型:

class Register(FlaskForm):
      username = StringField('Username',validators=[DataRequired(),
                    Length(min=2, max=20)],)
      email = StringField('Email',validators=[DataRequired(),Email()])

      password = PasswordField('Password', validators=[DataRequired()])
      confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')])
      submit = SubmitField('Sign Up')

      def validate_email(self,data_field):
              if User.query.filter_by(email =data_field.data).first():
            raise ValidationError('There is an account with that email')

      def validate_username(self,data_field):
      if User.query.filter_by(username = data_field.data).first():
        raise ValidationError('That username is taken')

class Login(FlaskForm):
      email = StringField('Email',validators=[DataRequired(),Email()])

      password = PasswordField('Password', validators=[DataRequired()])
      remember = BooleanField('Remember Me')
      submit = SubmitField('Login')

这是我用来呈现表单域的宏,以便将它们用于 material 设计 bootstrap。

{% macro render_field(field, label_visible=true) %}

        {{ field(class_='form-control validate' , **kwargs) }}
        {% if field.errors %}
            {% for e in field.errors %}
                <p class="help-block">{{ e }}</p>

            {% endfor %}
        {% else %}
            {% if field.type != 'HiddenField' and label_visible %}
            <label for="{{ field.id }}" data-error="wrong" data-success="right">{{ field.label }}</label>
            {% endif %}
        {% endif %}
    
{% endmacro %}

这是我的路线的视图函数。

@app.route("/")
@app.route("/home",methods=['GET','POST'])
def home():
    registerForm = Register()
    form = Login()
    if current_user.is_authenticated:
        return redirect(url_for('circles'))
    if registerForm.validate_on_submit():
        hashed_password = bcrypt.generate_password_hash(form.password.data).decode('utf-8')
        user = User(username = form.username.data, email = form.email.data, password = hashed_password)
        db.session.add(user)
        db.session.commit()
        flash(f'Your account has been created! You are now able to login!','success')
        return redirect(url_for('home'))

    if form.validate_on_submit():
        user = User.query.filter_by(email=form.email.data).first()
    if user and bcrypt.check_password_hash(user.password,form.password.data):
        login_user(user, remember=form.remember.data)
        next_page = request.args.get('next')
        return redirect(next_page) if next_page else redirect(url_for('circles'))

    else:
        flash('Login Unsuccessful. Please check email and password','danger')
#form=form, registerForm=registerForm

return render_template('home.html', title='login',form=form )


@app.route("/circle",methods=['GET','POST'])
def circles():
    return render_template('circle.html')

这是我实现登录模式的方式。

<div class="modal fade" id="modalLoginForm" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"
      aria-hidden="true">
      <div class="modal-dialog" role="document">
        <div class="modal-content">
          <div class="modal-header text-center">
            <h4 class="modal-title w-100 font-weight-bold">Sign in</h4>
            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
              <span aria-hidden="true">&times;</span>
            </button>
          </div>
          <form method="POST" action="">
            {{ form.hidden_tag() }}
            {% with messages = get_flashed_messages(with_categories=true) %}
                {% if messages %}
                {% for category,message in messages%}
                <div class="alert alert-{{ category }}">
                    {{message}}
                </div>
                {% endfor %}
                {% endif %}
                {% endwith %}
          <div class="modal-body mx-3">
            <div class="md-form mb-5">
              <i class="fas fa-envelope prefix grey-text"></i>
               {{ macros.render_field(form.email, label_visible=false, placeholder='Email', type='email') }}
            </div>
    
            <div class="md-form mb-4">
              <i class="fas fa-lock prefix grey-text"></i>
              {{ macros.render_field(form.password, label_visible=false, placeholder='Password', type='password') }}
              <p class="font-small blue-text d-flex justify-content-end">Forgot <a href="#" class="blue-text ml-1">
                    Password?</a></p>
            </div>
    
          </div>
          <div class="modal-footer d-flex justify-content-center">
            <!-- {{ form.submit(class="btn blue-gradient btn-block btn-rounded z-depth-1a") }} -->
            <button type="submit">submit</button>
          </div>
        </form>
        </div>
      </div>
    </div>
    

当我尝试提交时,它弹出错误,如果我给表单一个动作到圈子页面,它不会验证它只是重定向到 page.If 我将主视图分成两个不同的视图函数IE。登录并注册,并给他们每个人自己的模板,效果很好。当我将它们移回我的主视图以便使用模态访问我的导航栏上的两个模态时,它无法进行身份验证。任何人都可以深入了解我可能搞砸的地方。我是 Flask 的新手。

使用标签 <form method="POST" action="">,您的表单将提交到当前 url,因此 /。但只有 /home 端点支持 POST 方法。您应该将装饰器更改为 @app.route("/",methods=['GET','POST']),或者将表单标签更改为 action="/home".