登录的时候一直提示用户名或者是密码错误

来源:3-1 简单实现用户的登录

MaxLu

2021-04-22 18:23:50

问题描述:

登录的时候一直提示:用户名或者是密码错误,页面也不会跳转,但我输入的用户名和密码都没有错误

相关代码:

accounts/templates/login.html
​{% extends 'base.html' %}
{% from 'macro/form_errors.html' import form_field_errors %}
{% block title %}{{ super() }}-登录{% endblock %}
{% block header %}
<link rel="stylesheet" href="./assets/style/login.css">
<link rel="stylesheet" href="//at.alicdn.com/t/font_1658093_nokjvsp8hws.css">
{% endblock %}
{% block layout %}
<div class="container">
<div class="row">
<div class="col-md-6 col-md-offset-3">
{# 展示flash消息 #}
{% include 'components/flash_messages.html' %}
<!-- // 消息通知区域 -->
<div class="login-header">
<h2 class="title text-center">在线问答系统登录</h2>
<div class="slogan text-center">有问题 上问答</div>
</div>
<!-- 表单登录 -->
<!-- 表单登录 -->
<form class="login-form box-wrap" method="POST"
action="{{ url_for('accounts.login') }}">
<input type="hidden" name="next" value="{{ next_url|d('') }}">
{{ form.csrf_token }}
<div class="form-group">
<label for="id-user-name">用户名</label>
{{ form.username }}
</div>
{{ form_field_errors(form.username.errors) }}
<div class="form-group">
<label for="id-password">密码</label>
{{ form.password }}
</div>
{{ form_field_errors(form.password.errors) }}
<div class="form-group">
<button type="submit" class="btn btn-info btn-block btn-lg">登录</button>
</div>
<p class="desc">未注册手机验证后自动登录<br/>
注册即代表同意《用户使用协议》《隐私保护指引》</p>
<p class="text-right">没有账号,<a href="{{ url_for('accounts.register') }}">点击注册</a></p>
</form>
<!-- //表单登录 -->
<!-- 社交账号登录 -->
<div class="login-social box-wrap">
<span>社交账号登录</span>
<div class="right">
<span><i class="iconfont icon-wechat"></i>微信</span>
<span><i class="iconfont icon-qq"></i>QQ</span>
<span><i class="iconfont icon-weibo"></i>微博</span>
</div>
</div>
<!-- //社交账号登录 -->
<!-- 页脚 -->
<div class="login-footer">
<a href="">关于我们</a>
<a href="">联系我们</a>
<a href="">注册机构</a>
<a href="">专栏</a>
<br>
<a href="">京ICP 备1000000012号</a>
</div>
</div>
</div>
</div>
{% endblock %}

accounts/forms.py
import hashlib

from flask import request
from flask_login import login_user
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, ValidationError
from wtforms.validators import DataRequired, Length, EqualTo

from models import User, db, UserProfile, UserLoginHistory
from utils import constants
from utils.validators import phone_required


class RegisterForm(FlaskForm):
""" 用户注册 """
username = StringField(label='用户名', render_kw={
'class': 'form-control input-lg',
'placeholder': '请输入用户名'
}, validators=[DataRequired('请输入用户名'), phone_required])
nickname = StringField(label='用户昵称', render_kw={
'class': 'form-control input-lg',
'placeholder': '请输入用户昵称'
}, validators=[DataRequired('请输入用户昵称'),
Length(min=2, max=20, message='昵称长度在2-20之间')])
password = PasswordField(label='密码', render_kw={
'class': 'form-control input-lg',
'placeholder': '请输入密码'
}, validators=[DataRequired('请输入密码')])
confirm_password = PasswordField(label='确认密码', render_kw={
'class': 'form-control input-lg',
'placeholder': '请输入确认密码'
}, validators=[DataRequired('请输入确认密码'),
EqualTo('password', message='两次密码输入不一致')])

def validate_username(self, field):
""" 检测用户名是否已经存在 """
user = User.query.filter_by(username=field.data).first()
if user:
raise ValidationError('该用户名已经存在')
return field

def register(self):
""" 自定义的用户注册函数 """
# 1. 获取表单信息
username = self.username.data
password = self.password.data
nickname = self.nickname.data
# 2. 添加到db.session
try:
# 将密码加密存储
password = hashlib.sha256(password.encode()).hexdigest()
user_obj = User(username=username, password=password, nickname=nickname)
db.session.add(user_obj)
profile = UserProfile(username=username, user=user_obj)
db.session.add(profile)
db.session.commit()
return user_obj
except Exception as e:
print(e)
return None


class LoginForm(FlaskForm):
""" 用户登录 """
username = StringField(label='用户名', render_kw={
'class': 'form-control input-lg',
'placeholder': '请输入用户名'
}, validators=[DataRequired('请输入用户名'), phone_required])
password = PasswordField(label='密码', render_kw={
'class': 'form-control input-lg',
'placeholder': '请输入密码'
}, validators=[DataRequired('请输入密码')])

def validate(self):
result = super().validate()
username = self.username.data
password = self.password.data
if result:
# TODO 验证加密后的密码是否正确
user = User.query.filter_by(username=username, password=password).first()
if user is None:
result = False
self.username.errors = ['用户名或者是密码错误']
elif user.status == constants.UserStatus.USER_IN_ACTIVE.value:
result = False
self.username.errors = ['用户已被禁用']
return result

def do_login(self):
""" 执行登录逻辑代码 """
username = self.username.data
password = self.password.data
try:
# 1. 查找对应的用户
# TODO 验证加密后的密码是否正确
user = User.query.filter_by(username=username, password=password).first()
# 2. 登录用户
# session['user_id'] = user.id
login_user(user)
# 3. 记录日志
ip = request.remote_addr
ua = request.headers.get('user-agent', None)
obj = UserLoginHistory(username=username, ip=ip, ua=ua, user=user)
db.session.add(obj)
db.session.commit()
return user
except Exception as e:
print(e)
return None

相关截图:

http://img.mukewang.com/climg/60814eae0985128408680786.jpg

写回答

2回答

时间,

2021-04-22

同学,你好!在注册时对密码进行了加密,而登录时密码没有加密,因此报错了。同学可根据下述代码进行修改

http://img.mukewang.com/climg/608154a10972020b15140758.jpg

祝学习愉快!

0

MaxLu

提问者

2021-04-22

views.py
​import hashlib

from flask import Blueprint, render_template, flash, redirect, url_for, session, request
from flask_login import login_user, logout_user

from accounts.forms import RegisterForm, LoginForm
from models import User, db, UserProfile, UserLoginHistory

accounts = Blueprint('accounts', __name__,
template_folder='templates',
static_folder='../assets')


@accounts.route('/login', methods=['GET', 'POST'])
def login():
""" 登录页面 """
form = LoginForm()
next_url = request.values.get('next', url_for('qa.index'))
if form.validate_on_submit():
user = form.do_login()
if user:
# 4. 跳转到首页
flash('{}, 欢迎回来'.format(user.nickname), 'success')
return redirect(next_url)
else:
flash('登录失败,请稍后重试', 'danger')
# else:
# print(form.errors)
return render_template('login.html', form=form, next_url=next_url)


@accounts.route('/logout')
def logout():
""" 退出登录 """
# 自定义登录的逻辑代码
# session['user_id'] = ''
# g.current_user = None
logout_user()
flash('欢迎下次再来', 'success')
return redirect(url_for('accounts.login'))


@accounts.route('/register', methods=['GET', 'POST'])
def register():
""" 注册 """
form = RegisterForm()
if form.validate_on_submit():
user_obj = form.register()
if user_obj:
# 跳转到登录的页面
flash('注册成功,请登录', 'success')
return redirect(url_for('accounts.login'))
else:
flash('注册失败,请稍后再试', 'danger')
return render_template('register.html', form=form)


@accounts.route('/mine')
def mine():
""" 个人中心 """
return render_template('mine.html')


0

0 学习 · 2433 问题

查看课程