Почему кнопка «Отправить» на моей Flask Python веб-странице перенаправляет на тот же шаблон HTML, а не на другой? - PullRequest
0 голосов
/ 19 марта 2020

Чего я хочу достичь: после входа в систему с правильными учетными данными на странице / login, пользователь перенаправляется на страницу / camera.

Фактический результат: / страница входа в систему только что перезагрузилась, с формой входы стерты.

Нет сообщений об ошибках / исключений

Я просмотрел код, но не могу понять, почему он это делает. Любая помощь приветствуется.

main.py:

from flask import Flask, render_template, redirect, url_for
from flask_wtf import FlaskForm
from flask_login import LoginManager, login_required
from flaskconfig import Config
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired
from werkzeug.security import check_password_hash


app = Flask(__name__)
app.config.from_object(Config)

logindatabase = {
    'User1': 'pbkdf2:sha256:150000$QLfB2gVe$fd76b36df43686e7a8e27a9066331727e246f0d2835688d8d303af2f9b13a1cc', 
    'User2': 'pbkdf2:sha256:150000$4rK2hvN8$d4940c3dac1ce6f293bc495934fce92cb840c470c83eb0e3b864f407eec85868'
}


class LoginForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired()])
    password = PasswordField('Password', validators=[DataRequired()])
    submit = SubmitField('Sign In')

@app.route('/')
def home():
  return redirect(url_for('login'))

@app.route('/login', methods = ['GET', 'POST'])
def login():
  form = LoginForm()
  if form.validate_on_submit():
    user = form.username.data
    if user is None or user not in logindatabase.keys() or check_password_hash(logindatabase[user], form.password.data) == False:
      return redirect(url_for('login'))
    else:
      login_user(user)
      return redirect(url_for('camera'))

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

@app.route('/camera')
@login_required
def camera():

  return render_template('camera.html')

if __name__ == '__main__':
  app.run(host = '0.0.0.0')

Примечание: работает на хосте 0.0.0.0, так как я работаю на repl.it (преднамеренно)

templates> логин. html:


<!DOCTYPE html>
<html>
  <head>
    <title>Login Page - Door Camera System</title>
  </head>
  <body>
    <h1>Welcome!</h1>

    <hr>

    {% with messages = get_flashed_messages() %}

    {% if messages %}
    <ul>
      {% for msg in messages %}
      <li>
        {{ msg }}
      </li>
      {% endfor %}
    </ul>
    {% endif %}
    {% endwith %}



    {% block content %}
        <h2>Sign In</h2>
        <form action="" method="get" novalidate>
            {{ form.hidden_tag() }}
            <p>
                {{ form.username.label }}<br>
                {{ form.username(size=32) }}
            </p>
            <p>
                {{ form.password.label }}<br>
                {{ form.password(size=32) }}
            </p>
            <p>{{ form.submit() }}</p>
            {{ form.csrf_token }}
        </form>
    {% endblock %}
  </body>
</html>


шаблоны> камера. html:

<!DOCTYPE html>
<html>
   <head>
      <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css">
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
      <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js"></script>
      <link href="https://gitcdn.github.io/bootstrap-toggle/2.2.2/css/bootstrap-toggle.min.css" rel="stylesheet">
      <script src="https://gitcdn.github.io/bootstrap-toggle/2.2.2/js/bootstrap-toggle.min.js"></script>
    </head>
    <body>
      <input type="checkbox" class='toggle' checked data-toggle="toggle">
      <div class='status'>System Active</div>
    </body>
    <script>
    $(document).ready(function() {
    $('.toggle').click(function() {
        var toggleval = $('.status').text();
        if (toggleval === 'System Disabled'){
          $('.status').html('System Active');
        }
        else{
          $('.status').html('System Disabled');
        }

      });
    });
  </script>


</html>

flaskconfig.py:

import os

class Config(object):
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'flaskwebsecretkey5000'

Спасибо, что много заранее !!

1 Ответ

0 голосов
/ 19 марта 2020

Метод должен быть POST и удален novalidate.

<form action="" method="post">
    {{ form.hidden_tag() }}
    <p>
        {{ form.username.label }}<br>
        {{ form.username(size=32) }}
    </p>
    <p>
        {{ form.password.label }}<br>
        {{ form.password(size=32) }}
    </p>
    <p>{{ form.submit() }}</p>
    {{ form.csrf_token }}
</form>
...