Я потратил часы, но я не знаю, где ошибка. Я пробую колбу прямо сейчас и хочу реализовать страницу входа. Но логин не работает, просто переадресовывает без проверки, что я делаю не так?
Это функция входа:
@app.route('/login', methods=['GET', 'POST'])
def login():
name = request.form.get('name')
password = request.form.get('password')
remember = True if request.form.get('remember') else False
user = User.query.filter_by(name=name).first()
if user is None or not check_password_hash(user.password, password):
flash('Please check your login details and try again.')
return redirect(url_for('auth.login'))
else:
return redirect(url_for('profile.profile'))
return render_template('login.html')
Всякий раз, когда я пытаюсь посетить «http://localhost../login», он просто перенаправляется на /profile, куда я просто хочу перенаправить, когда вход в систему был успешным. Я потратил почти весь день на поиски решений в инете и перепробовал много чего, но это не сработает.
Вот иерархия моего приложения:
├── app
│ ├── app.db
│ ├── auth
│ │ ├── __init__.py
│ │ ├── __pycache__
│ │ │ ├── __init__.cpython-39.pyc
│ │ │ └── views.cpython-39.pyc
│ │ └── views.py
│ ├── base
│ │ ├── __init__.py
│ │ ├── __pycache__
│ │ │ ├── __init__.cpython-39.pyc
│ │ │ └── views.cpython-39.pyc
│ │ └── views.py
│ ├── chat
│ │ ├── __init__.py
│ │ ├── __pycache__
│ │ │ ├── __init__.cpython-39.pyc
│ │ │ └── views.cpython-39.pyc
│ │ └── views.py
│ ├── home
│ │ ├── __init__.py
│ │ ├── __pycache__
│ │ │ ├── __init__.cpython-39.pyc
│ │ │ └── views.cpython-39.pyc
│ │ └── views.py
│ ├── __init__.py
│ ├── models.py
│ ├── profile
│ │ ├── __init__.py
│ │ ├── __pycache__
│ │ │ ├── __init__.cpython-39.pyc
│ │ │ └── views.cpython-39.pyc
│ │ └── views.py
│ ├── __pycache__
│ │ ├── auth.cpython-39.pyc
│ │ ├── __init__.cpython-39.pyc
│ │ └── models.cpython-39.pyc
│ ├── static
│ │ ├── base.css
│ │ ├── home.css
│ │ ├── login.css
│ │ └── main_bgr.jpg
│ └── templates
│ ├── base.html
│ ├── chat.html
│ ├── home.html
│ ├── login.html
│ ├── profile.html
│ └── signup.html
В первом операторе if я также пробовал:
if user.name == None
Но это приводит к "Страница не перенаправляется должным образом"
@AriaN Это был вывод print: «User None»
Попробуйте заменить is
на ==
, посмотрите, исправлено это или нет.
@AriaN Нет, все так же.
проверить len(user) == 0
@AriaN TypeError: у пользователя нет len
Я также пробовал, если user.name == None, и теперь есть «Проблема с загрузкой страницы», страница не перенаправляется должным образом.
Давайте продолжим обсуждение в чате.
«Пользовательский нет» не является None
. Это похоже на представление User
с именем пользователя «Нет». Есть ли такая запись в вашей БД?
@Noah Я проверил командную строку, и это единственная запись, но на самом деле я уже должен был сделать записи ..
Я заставил его правильно перенаправлять, но теперь я вижу, что на самом деле он не получает имя, оно всегда None
Я предполагаю, что запись формы «имя» пуста или не существует к тому времени, когда вы читаете ее здесь. Возможно, аналогичная проблема в другом месте привела к созданию поддельного пользователя с именем пользователя (буквально) «Нет».
@Noah Думаю, я понял проблему. «user = User.query[...]» выполняется перед строками перед «request.form.get». Так что это проблематично, но я не нахожу способа решить эту проблему.
Итак, у меня есть несколько вопросов, во-первых, на какую страницу он перенаправляется и на какую страницу, по вашему мнению, он должен быть перенаправлен? Похоже, вы никогда не попадете на страницу login.html (ваш if else всегда будет перенаправлять вас, прежде чем вы попадете туда). Во-вторых, проблема может заключаться в хэше вашего пароля, но у нас нет этой функции, на которую можно было бы обратить внимание.
Я полностью уверен, что это сработает, но я заметил, что нет условия, если метод POST или GET
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == "POST" :
name = request.form.get('name')
password = request.form.get('password')
remember = True if request.form.get('remember') else False
user = User.query.filter_by(name=name).first()
if user is None or not check_password_hash(user.password, password):
flash('Please check your login details and try again.')
return redirect(url_for('auth.login'))
else:
return redirect(url_for('profile.profile'))
return render_template('login.html')
Еще раз извините, если это не решит проблему.
Нет, это не сработало, на самом деле это просто GET-запросы, но не POST-запросы.
Я немного изменил его на это:
@app.route('/login', methods=['GET', 'POST'])
def login():
''' Login Method '''
if request.method == 'POST':
print('post')
name = request.form.get('name')
password = request.form.get('password')
remember = True if request.form.get('remember') else False
# = User(name=name, password=password)
user = User.query.filter_by(name=name).first()
if not user or not check_password_hash(user.password, password):
return render_template('login.html')#redirect(url_for('auth.login'))
else:
return render_template('login.html')
return redirect(url_for('home.home'))
И теперь это работает! :) Большое спасибо @Vishnu Joshi, ваш подход помог мне это исправить!
Рад узнать, что это помогло!
напечатать значение
user
после его назначения