用flask开发个人博客(31)——用flask_login管理用户的登录

一、flask_login的安装

        本文主要介绍使用flask_login管理用户的登录和登出。flask_login的安装:

pip install flask-login

二、User模型继承UserMixin

       使用flask_login进行用户的登录和登出管理,需要将我们的User模型继承flask_login的UserMixin基类:

from flask_login import UserMixin
class User(db.Model,UserMixin):
    __tablename__='users'
    id=db.Column(db.Integer,primary_key=True)
    username=db.Column(db.String(64),unique=True,index=True)
    role_id=db.Column(db.Integer,db.ForeignKey('role.id'))
    hash_password=db.Column(db.String(28))


三、flask_login的初始化

        我们在app的工厂函数中,实现flask_login的初始化。为此,我们先引入LoginManager,并设置相关参数:
from flask_login import LoginManager

loginmanager=LoginManager()
loginmanager.session_protection='strong'
loginmanager.login_view='main.login'

def create_app(config_name):  
    app=Flask(__name__)  
    ......
    loginmanager.init_app(app)
    ......

       session_protection设置登录用户的安全级别,可选None、'basic'、'strong',安全等级由低到高。最高的安全等级‘strong’,flask_login会记住客户端的IP地址和用户代理信息,如果发现有不一致就登出用户。login_view设置的是我们进行登录操作的视图函数,因为我们打算在蓝本main中的login函数中进行登录测试,所以这里设置成了'main.index'。在create_app函数中,我们调用了loginmanager的init_app绑定了flask程序。
      初始化完成LoginManger之后,我们还要在模型中定义一个回调函数,用来登录验证时LoginManger从数据库加载用户:
from . import loginmanager
@loginmanager.user_loader
def load_user(id):
    return User.query.get(int(id))

四、使用login_user和logout_user进行用户的登录和登出

         login_user(User,bool)用来进行用户的登录,它接受两个参数,第一个是我们定义的User类的对象;第二个是个bool值,置为true会将用户的信息写到cookie中,下次打开浏览器会自动登录,置为flase,关闭浏览器后会话就会结束。logout_user()不需要传参,它会将本次会话登录的User进行登出。为了验证login_user和logout_user的使用,我们定义如下表单用来验证login_user和logout_user:

  
class NameForm(FlaskForm):  
    name=TextField('what is your name?',validators=[DataRequired()])  
    password=PasswordField('what is your password?',validators=[DataRequired()])
    login=SubmitField('login')
    logout=SubmitField('logout')
        我们在表单中定义两个SubmitField,一个用来登录,一个用来登出。在视图函数中定义/login视图:

@main.route('/login',methods=['GET','POST'])
def login():
    form=NameForm()
    user=User.query.filter_by(username=form.name.data).first()
    if form.validate_on_submit():
        if user is not None and user.confirm_password(form.password.data):
            if current_user.is_authenticated:
                logout_user()
                flash('User Logout')
            else:
                login_user(user,True)
                flash('User Login')
    return render_template('login.html',form=form)
        current_user是flask_login提供的一个全局的变量,表示当前登录的用户。它有一个is_authenticated的字段,如果有用户登录它将返回True,否则返回False。我们使用is_authenticated来判断用户是否登录,来显示是form显示login还是logout。对应的login.html内容如下:

<form method="POST">  
	 {% for message in get_flashed_messages() %}
	 	<p>{{ message }}</p>
	 {% endfor %}
    {{form.hidden_tag()}}  
    <p>{{form.name.label}}</p>
    {{form.name()}}  
    <p>{{ form.password.label }}</p>
    {{ form.password() }}
    {%if current_user.is_authenticated %}
	 <br>{{form.logout}}
	 {% else %}
	 <br>{{form.login}}
	 {% endif %}
</form> 

        输入正确的账号和密码后,点击login按钮,效果如下:


点击登出按钮,效果如下:


五、使用login_required限制登录对象

        login_require是一个修饰器,可以限制url只有登录的用户可以访问,如下我们定义了一个私密的连接,只有用户登录后才能进行访问:
@main.route('/loginrq',methods=['GET','POST'])
@login_required
def loginrq():
    return 'I''m a private url'
        当我们在用户未登录的情况下,输入http://localhost:5000/loginrq时,flask会提示我们先进行登录:
        你会发现,它不仅提示我们要先进行登录,而且还渲染了登录界面。这就是我们为什么在第三节初始化flask_login时要告诉它登录的视图函数的原因:
loginmanager.login_view='main.login'
        当我们登录之后,再次输入http://localhost:5000/loginrq,发现可以渲染我们定义的私密视图了:




Github位置:
https://github.com/HymanLiuTS/flaskTs
克隆本项目:
Git  clone  Git @github.com:HymanLiuTS/flaskTs.git
获取本文源代码:
git checkout FL31


  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个简单的 Flask 应用程序,使用 SQLAlchemy 和 Flask-Login 进行用户身份验证: ```python from flask import Flask, render_template, request, redirect, url_for from flask_login import LoginManager, login_user, logout_user, login_required, UserMixin from sqlalchemy import create_engine, Column, Integer, String from sqlalchemy.orm import sessionmaker from werkzeug.security import generate_password_hash, check_password_hash app = Flask(__name__) app.secret_key = 'secret_key' # 创建数据库连接 engine = create_engine('sqlite:///users.db', echo=True) # 创建用户表模型 class User(UserMixin, Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) username = Column(String(50), unique=True, nullable=False) password_hash = Column(String(128), nullable=False) def __repr__(self): return '<User %r>' % self.username # 初始化登录管理login_manager = LoginManager() login_manager.init_app(app) # 加载用户的回调函数 @login_manager.user_loader def load_user(user_id): Session = sessionmaker(bind=engine) session = Session() return session.query(User).get(int(user_id)) # 登录页面 @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] Session = sessionmaker(bind=engine) session = Session() # 根据用户名查询用户 user = session.query(User).filter_by(username=username).first() if user and check_password_hash(user.password_hash, password): # 登录成功,将用户添加到会话中 login_user(user) return redirect(url_for('index')) else: # 登录失败,显示错误信息 return render_template('login.html', error='用户名或密码错误') return render_template('login.html') # 注销页面 @app.route('/logout') @login_required def logout(): # 从会话中删除用户 logout_user() return redirect(url_for('login')) # 主页 @app.route('/') @login_required def index(): return render_template('index.html') if __name__ == '__main__': app.run(debug=True) ``` 这段代码创建了一个名为 `users.db` 的 SQLite 数据库,其中包含一个名为 `users` 的表,该表包含用户用户名和密码散列值。用户可以在登录页面中进行身份验证,如果验证通过,则将用户添加到会话中,以便在应用程序的其他部分进行访问。如果用户注销,则会从会话中删除用户。主页需要进行身份验证,因此只有已登录用户才能访问它。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值