用户登录组件Flask-Login
文档:
flask_login提供的方法
# 类
UserMixin 用户类
#方法
login_user() 用户登入
logout_user() 登出功能
# 变量
current_user 获取当前用户
# 装饰器
@login_required 访问限制
# 1、实例化登录管理对象
login_manager = LoginManager(app)
# 2、编写用户类
class User(UserMixin):
pass
# 3、加载用户, login_required 需要查询用户信息
@login_manager.user_loader
def user_loader(user_id: str):
"""
[注意] 这里的user_id类型是str
"""
return User()
# 4、登录
@app.route('/login', methods=['GET', 'POST'])
def login():
login_user(User())
# 5、登出功能实现
@app.route('/logout')
@login_required
def logout():
logout_user(User())
# 6、访问控制
@app.route('/')
@login_required
def index():
pass
app.py
from flask import Flask, request, flash, render_template, redirect, url_for
from flask_login import UserMixin, LoginManager, login_required, logout_user, login_user, current_user
# 创建 Flask 应用
app = Flask(__name__)
app.secret_key = 'secret_key' # 设置表单交互密钥
# 模拟数据库查询
class UserService:
users = [
{
'id': 1, 'username': 'tom', 'password': '1'},
{
'id': 2, 'username': 'jack', 'password': '2'}
]
@classmethod
def query_user_by_name(cls, username):
for user in cls.users:
if username == user['username']:
return user
@classmethod
def query_user_by_id(cls, user_id):
for user in cls.users:
if user_id == user['id']:
return user
# 1、实例化登录管理对象
login_manager = LoginManager()
# 参数配置
login_manager.login_view = 'login'
login_manager.login_message_category = 'info'
login_manager.login_message = 'Access denied.'
login_manager.init_app(app) # 初始化应用
# 2、编写用户类
class User(UserMixin):
pass
# 3、加载用户, login_required 需要查询用户信息
@login_manager.user_loader
def user_loader(user_id: str):
"""
[注意] 这里的user_id类型是str
:param user_id:
:return:
"""
if UserService.query_user_by_id(int(user_id)) is not None:
curr_user = User()
curr_user.id = user_id
return curr_user
# 4、登录
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form.get('username')
user = UserService.query_user_by_name(username)
if user is not None and request.form['password'] == user['password']:
curr_user = User()
curr_user.id = user['id']
# 通过Flask-Login的login_user方法登录用户
login_user(curr_user)
# 登录成功后重定向
next_url = request.args.get('next')
return redirect(next_url or url_for('index'))
flash('Wrong username or password!')
else:
# GET 请求
return render_template('login.html')
# 5、登出功能实现
@app.route('/logout')
@login_required
def logout():
# 通过Flask-Login的logout_user方法登出用户
logout_user()
return 'Logged out successfully!'
# 6、访问控制
@app.route('/')
@login_required
def index():
return 'index: ' + current_user.get_id()
if __name__ == '__main__':
app.run(debug=True)
视图文件 templates/login.html
<!DOCTYPE html>
<title>Login</title>
<h1>Login</h1>
{% with messages = get_flashed_messages() %}
<div>{
{ messages[0] }}</div>
{% endwith %}
<form action="{
{ url_for('login') }}" method="POST">
<p><input type="text" name="username" id="username" placeholder="Username"/></p>
<p><input type="password" name="password" id="password" placeholder="Password"/></p>
<p><input type="submit" name="submit"/></p>
</form>
查找了很多文章,都没有解决这个问题(因为全tm是xjb写,xjb抄的),要解决这个问题,首先要清楚什么是桥接网络。可以看到,桥接网络中宿主机和虚拟机是地位平等的,在同一网段的,然后利用同一个路由器与外界进行通信。那么一:宿主机和虚拟机的ip网段就必须相同,主机号不同宿主机可以用ipconfig查看网络ip虚拟机可以用ifconfig或者ip addr查看我用的是无线网,所以和无线网ip网段保持一致...
1、对Application类的理解其实说对什么的理解,就是考察你对这个东西会不会用,重点是有没有什么坑!首先,Application在一个Dalvik虚拟机里面只会存在一个实例,所以你不要傻傻的去弄什么单例模式,来静态获取Application了,你把Application构造函数设置成privete都不可能实现(我年轻的时候就这么傻傻的试过,想着如果可以通过Single
Qt 各个版本下载路径:http://download.qt.io/archive/ qt-opensource-windows-x86-winrt-msvc2015-5.6.3.exe19-Sep-2017 08:151.0GDetails qt-opensource-windows-x86-winrt-msvc2013-5.6.3.exe19-Sep-2017 08:131.0GDetails...
《一个会写诗的程序员》 东海光剑人间至无味 3他生知已 4夜莺没有来 4清晨时分 5零落香 5半未匀 5心归何处 6江南正值春 6嗅花人 几人懂 6她 7相思泪 7凌晨四点钟的街道 8看不见的城市 8夜空 8人间天使 8飞扬 9单纯的理想 10意义 11一念之...
现象在Mac上启动tomcat时,报了如下错误:Error: Exception thrown by the agent : java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException: XXXX: XXXX: nodename nor servname provided, or no...
表单中添加复选框喜欢那种面鲜虾鱼板面牛肉面香菇炖鸡面梅菜扣肉面番茄牛肉面红烧牛肉面
LCM在智能驾驶车辆内部通讯中使用频率很高,在嵌入式端部署代码时将处理的实时图像传输到PC显示也是用到LCM。0 安装LCM1.sudo apt-get install build-essential autoconf automake autopoint libglib2.0-dev libtool openjdk-8-jdk python-dev2.将下载好的lcm1.3.0包进行解压,...
文章目录1. 朴素贝叶斯法的学习与分类1.1 基本方法1.2 后验最大化含义2. 朴素贝叶斯的参数估计2.1 公式推导3. 面试常见问题3.1 朴素贝叶斯与LR的区别?3.2 在估计条件概率P(X|Y)时出现概率为0的情况怎么办?3.3 为什么属性独立性假设在实际情况中很难成立,但朴素贝叶斯仍能取得较好的效果?3.4 朴素贝叶斯的优缺点?参考文献1. 朴素贝叶斯法的学习与分类1.1 基本方法...
EasyDSS云平台EasyDSS云平台是一套由EasyDSS、EasyCMS、EasyCamera或EasyNVR、EasyClient、nginx、redis构成的完整云平台架构,支持分布式、跨平台、多点部署,流媒体服务器支持负载均衡,按需直播,非常适用于互联网化的安防、智能家居、幼教平台、透明厨房、透明家装等多个行业应用。 EasyDSS流媒体云平台具备EasyCamera(摄像机、An
链路聚合简介以太网链路聚合Eth-Trunk简称链路聚合,它通过将多条以太网物理链路捆绑在一起成为一条逻辑链路,从而实现增加链路带宽的目的。同时,这些捆绑在一起的链路通过相互间的动态备份,可以有效地提高链路的可靠性。目的:随着网络规模不断扩大,用户对骨干链路的带宽和可靠性提出越来越高的要求。在传统技术中,常用更换高速率的接口板或更换支持高速率接口板的设备的方式来增加带宽,但这种方案需要付出高额的费用,而且不够灵活。采用链路聚合技术可以在不进行硬件升级的条件下,通过将多个物理接口捆绑为一个逻辑接口
整整两个月没有更新博客了,真是越来越懒了,哎,拖延症一直都在,希望自己能战胜懒惰,重拾热情啊。实习的六月在理光的实习结束了,6月后半段,已经慢慢在准备交接的事情,写了一个MFC的演示程序,把检索的接口写好了给了师兄,整理了在公司所有的资料,该提交的,该删除的,该自己带走的,吃了告别的聚餐,依依惜别的组里的大小同事们。感觉这个实习对我的帮助还是很大的,最主要的还是在写C++上,包括代码封装,...
接上篇文章的线性模型是一个实验,这次使用pytorch实现神经网络LENET5手写识别MNIST卷积层块里的基本单位是卷积层后接平均池化层:卷积层用来识别图像里的空间模式,如线条和物体局部,之后的平均池化层则用来降低卷积层对位置的敏感性。科普一下LENET5:手写字体识别模型LeNet5诞生于1994年,是最早的卷积神经网络之一。LeNet5通过巧妙的设计,利用卷积、参数共享、池化等操作...