Flask-Login 用户控制用户会话管理,简单点说,就是控制登录。如果是自己写的登录系统,一般都是通过操作session ,然后后台根据session 来判断权限。Flask-Login 就是负责这部分。直接开始
安装
pip install flask-login
导入LoginManager
from flask_login import LoginManager
#创建一个 login_manager
login_manager = LoginManager()
#需要提供一个 user_loader 回调。这个回调用于从会话中存储的用户 ID 重新加载用户对象。它应该接受一个用户的 unicode ID 作为参数,并且返回相应的用户对象。
@login_manager.user_loader
def load_user(user_id):
from epay.models import User
user = User.query.get(int(user_id))
return user
用户的类需要实现这些属性和方法:
is_authenticated
当用户通过验证时,也即提供有效证明时返回 True 。(只有通过验证的用户会满足 login_required 的条件。)
is_active
如果这是一个活动用户且通过验证,账户也已激活,未被停用,也不符合任何你 的应用拒绝一个账号的条件,返回 True 。不活动的账号可能不会登入(当然, 是在没被强制的情况下)。
is_anonymous
如果是一个匿名用户,返回 True 。(真实用户应返回 False 。)
get_id()
返回一个能唯一识别用户的,并能用于从 user_loader 回调中加载用户的 unicode 。注意着 必须 是一个 unicode —— 如果 ID 原本是 一个 int 或其它类型,你需要把它转换为 unicode 。
要简便地实现用户类,你可以从 UserMixin 继承,它提供了对所有这些方法的默认 实现。(虽然这不是必须的。)
class User(db.Model,UserMixin):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(100), nullable=False)
email = db.Column(db.String(100), nullable=False)
password = db.Column(db.String(100), nullable=False)
created_at = db.Column(db.Date, nullable=True)
login_date = db.Column(db.Date, nullable=True)
查看登录的逻辑
auth.py
from flask import Blueprint,render_template,request,redirect,url_for,flash
from flask_login import login_user, logout_user, login_required, current_user
from epay.models import User
import hashlib
from epay.forms import UserForm
auth_bp = Blueprint('auth',__name__)
@auth_bp.route('/login',methods=['POST','GET'])
def login():
form = UserForm()
if request.method == 'POST':
email = request.form.get('email') # args取get方式参数
password = request.form.get('password')
password = hashlib.md5(password.encode(encoding='utf-8')).hexdigest()
user = User.query.filter_by(email=email,password=password).first()
if user:
flash('Welcome back.', 'info')
login_user(user)
return redirect(url_for('admin.index'))
else:
flash('Invalid username or password.', 'warning')
return render_template('auth/login.html',form=form)
elif request.method == 'GET':
return render_template('auth/login.html',form=form)
@auth_bp.route('/logout')
def logout():
logout_user()
return redirect(url_for('auth.login'))
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<!-- basic -->
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!-- mobile metas -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="viewport" content="initial-scale=1, maximum-scale=1">
<!-- site metas -->
<title></title>
<meta name="keywords" content="">
<meta name="description" content="">
<meta name="author" content="">
<!-- site icon -->
<link rel="icon" href="{{ url_for('static',filename ='images/fevicon.png') }} " type="image/png" />
<!-- bootstrap css -->
<link rel="stylesheet" href="{{ url_for('static',filename ='css/bootstrap.min.css') }}" />
<!-- site css -->
<link rel="stylesheet" href="{{ url_for('static',filename ='style.css') }}" />
<!-- responsive css -->
<link rel="stylesheet" href="{{ url_for('static',filename ='css/responsive.css') }}" />
<!-- color css -->
<link rel="stylesheet" href="{{ url_for('static',filename ='css/colors.css') }}" />
<!-- select bootstrap -->
<link rel="stylesheet" href="{{ url_for('static',filename ='css/bootstrap-select.css') }}" />
<!-- scrollbar css -->
<link rel="stylesheet" href="{{ url_for('static',filename ='css/perfect-scrollbar.css') }}" />
<!-- custom css -->
<link rel="stylesheet" href="{{ url_for('static',filename ='css/custom.css') }}" />
<!-- calendar file css -->
<link rel="stylesheet" href="{{ url_for('static',filename ='js/semantic.min.css') }}" />
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body class="inner_page login">
<div class="full_container">
<div class="container">
<div class="center verticle_center full_height">
<div class="login_section">
<div class="logo_login">
<div class="center">
<img width="210" src="{{ url_for('static',filename ='images/logo/logo.png') }}" alt="#" />
</div>
</div>
<div class="login_form">
<form action="{{ url_for('auth.login') }}" method="POST">
{{ form.csrf_token }}
<fieldset>
<div class="field">
<label class="label_field">Email Address</label>
<input type="email" name="email" placeholder="E-mail" />
</div>
<div class="field">
<label class="label_field">Password</label>
<input type="password" name="password" placeholder="Password" />
</div>
<div class="field margin_0">
<label class="label_field hidden">hidden label</label>
<button class="main_bt">Sing In</button>
</div>
</fieldset>
</form>
</div>
</div>
</div>
</div>
</div>
<!-- jQuery -->
<script src="{{ url_for('static',filename ='js/jquery.min.js') }}"></script>
<script src="{{ url_for('static',filename ='js/popper.min.js') }}"></script>
<script src="{{ url_for('static',filename ='js/bootstrap.min.js') }}"></script>
<!-- wow animation -->
<script src="{{ url_for('static',filename ='js/animate.js') }}"></script>
<!-- select country -->
<script src="{{ url_for('static',filename ='js/bootstrap-select.js') }}"></script>
<!-- nice scrollbar -->
<script src="{{ url_for('static',filename ='js/perfect-scrollbar.min.js') }}"></script>
<script>
var ps = new PerfectScrollbar('#sidebar');
</script>
<!-- custom js -->
<script src="{{ url_for('static',filename ='js/custom.js') }}"></script>
{% for message in get_flashed_messages() %}
<script>
alert("{{ message }}")
</script>
{% endfor %}
</body>
</html>
精简一下,当我们判断了账号和密码匹配成功后, 就调用login_user(user)方法,表示系统已经登录了这个用户了。如果在其他路由想判断是否已经登录,在方法前面加上 @login_required,如下:
@admin_bp.route('/')
@admin_bp.route('/index')
@login_required
def index():
return render_template('admin/index.html')
如果用户尚未登录,就跳转到该路径,就会自动跳回登录页,登录页我们需要配置一下,在初始化 login_manager 的页面:
login_manager.login_view = 'auth.login'
这样就完成了一个简单的配置了,测试模板中就会多出一个默认变量 current_user
如果想在模板直接输出用户名,就可以这样写:
{{ current_user.username }}
更多的操作可以查看以下地址:
http://www.pythondoc.com/flask-login/index.html#id1
(部分解释也是出自以上地址)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/97979.html