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

标签 python flask jinja2 flask-wtforms

我试图将经过身份验证的用户重定向到新的模板文件,但每次我都会收到“请求的 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>
    

当我尝试提交时,它会弹出错误,如果我向圆圈页面提供表单操作,它不会进行身份验证,它只会重定向到该页面。如果我将主页 View 分成两个不同的 View 功能,即。登录并注册,并给他们每个人自己的模板,效果很好。当我将它们移回我的主视图以便使用模态访问导航栏上的两个模态时,它无法进行身份验证。谁能告诉我我可能搞砸的地方。我是 Flask 的新手。

最佳答案

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

关于python - 如何修复 Flask 中的 "The method is not allowed for the requested URL",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55787047/

相关文章:

python - Tensorflow 中的目标必须是一维 Top_k_categorical_accuracy

Python/Flasks/Socketio,socketio.emit(...) 不发出

python - 如何在CKAN中制作定制中间件

python - Flask 配置文件不起作用

python - Jinja2 ASCII 转字符串

python - 使用 Django 客户端多个复选框进行测试

python - 在 Windows 上升级 TensorFlow

python - 通过Python输入终端输入

json - JMESPath 从对象的对象生成对象数组

python - 如何在 Jinja 模板中显示 Enum 成员的值?