在flask中实现验证用户登录

flask验证用户登录


from flask import Flask, flash, render_template, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import UserMixin, login_required, LoginManager, login_user
from flask_wtf import FlaskForm
from wtforms.validators import DataRequired, Length
from wtforms import StringField, SubmitField, PasswordField
from flask_bootstrap import Bootstrap
from flask_migrate import Migrate
import os

base_dir = os.path.abspath(os.path.dirname(__file__))
app = Flask(__name__)
app.config['SECRET_KEY'] = "sdflk*()"
app.config['SQLALCHEMY_DATABASE_URI'] = \
	'sqlite:///' + os.path.join(base_dir, 'data.sqlite')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
login_manager = LoginManager(app)
login_manager.login_view = 'login' # 设置登录页面的端点
bootstrap = Bootstrap(app)
migrate = Migrate(app, db)

class UserForm(FlaskForm):

    username = StringField('username', validators=[DataRequired(), Length(5, 15)])
    password = PasswordField('password', validators=[DataRequired(), Length(5, 15)])
    submit = SubmitField('login')

class User(UserMixin , db.Model):

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20), unique=True)
    password_hash = db.Column(db.String(128))

    @property
    def password(self):
    	'''设置密码的属性为只写,如果强行读取则返回错误'''
        raise AttributeError('密码不能读取')
    
    @password.setter
    def password(self, password):
    	'''当类初始化时自动调用,把password的值转换为散列值'''
        self.password_hash = generate_password_hash(password)
    
    def verify_password(self, password) -> bool:
    	'''用于登录时验证密码'''
        return check_password_hash(self.password_hash, password)

@login_manager.user_loader # 把函数注册给flask-login, 当flask-login要获取用户信息时调用
def load_user(id):
	'''用于加载用户'''
    return User.query.get(int(id))

@app.route("/login", methods=['GET', 'POST'])
def login():
    form = UserForm()
    if form.validate_on_submit():
        user = User.query.filter_by(username=form.username.data).first()
        if user is not None:
            if user.verify_password(form.password.data):
                flash('登录成功')
                login_user(user)# login_user的参数为要登录的用户,以及可选的"记住我"布尔值
                return redirect(url_for('index'))
        flash('登录失败')
    return render_template('login.html', form=form)

@app.route("/")
@login_required # 用于保护路由,只允许登录过的用户访问
def index():
    return render_template("index.html")

@app.shell_context_processor
def make_context_processor():
    return dict(db=db, User=User)

if __name__ == "__main__":
    app.run("0.0.0.0", 9999, True)

login.html

{% extends 'bootstrap/base.html' %}
{% import 'bootstrap/wtf.html' as wtf %}
{% block content %}
    
    <div class="container">
        
        <div class="page-header">
          <h1>Login</h1>
        </div>
        {% with messages = get_flashed_messages() %}
            {% if messages %}
                {% for message in messages %}
                    
                    <span class="label label-info">{{message}}</span><!-- 打印闪现消息-->
                    
                {% endfor %}
            {% endif %}
        {% endwith %}
        <div class="col-xs-5 col-sm-5 col-md-5 col-lg-5">
            {{ wtf.quick_form(form) }}
        </div>
        
    </div>
    
{% endblock content %}

index.html

{% extends 'bootstrap/base.html' %}
{% block content %}
    
    <div class="container">
        
        <div class="page-header">
          <h1>Index</h1>
        
        </div>
        <p>登录成功</p>
        
    </div>
    
{% endblock content %}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flask ,可以使用 Flask-Login 扩展来实现用户登录认证。 首先,需要安装 Flask-Login 扩展: ``` pip install flask-login ``` 然后,在 Flask 应用初始化 Flask-Login: ```python from flask import Flask from flask_login import LoginManager app = Flask(__name__) login_manager = LoginManager() login_manager.init_app(app) ``` 接着,需要定义一个 User 类,用于表示用户: ```python class User: def __init__(self, user_id): self.id = user_id ``` 实际运用时,需要将 User 类与具体的用户模型关联起来。 然后,需要实现一个回调函数,用于加载用户: ```python @login_manager.user_loader def load_user(user_id): return User(user_id) ``` 在用户登录时,需要验证用户的身份,并将用户登录状态保存到会话: ```python from flask import request, redirect, url_for from flask_login import login_user, current_user @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': # 验证用户身份 user_id = authenticate(request.form['username'], request.form['password']) if user_id is not None: # 登录成功,保存用户状态 user = User(user_id) login_user(user) return redirect(url_for('index')) return render_template('login.html') ``` 最后,在需要进行用户认证的视图函数,可以使用 `current_user` 变量来获取当前已登录用户对象: ```python from flask import abort from flask_login import login_required @app.route('/dashboard') @login_required def dashboard(): # 获取当前已登录用户对象 user = current_user if not user.is_admin: abort(403) # 显示用户的仪表盘 return render_template('dashboard.html', user=user) ``` 以上就是在 Flask 实现用户登录认证的基本流程。需要注意的是,上述代码只是一个示例,实际应用还需要根据具体的业务需求进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值