一个基于flask的web应用诞生 记录用户账户登录状态(6)


Posted in Python onApril 11, 2017

之前登录注册的功能都已经完成,但是登录成功回到首页发现还是白茫茫的一片,对的,title一直都写得博客,那么最终目的也是写出一个轻博客来,但是,在发表文章之前是不是要先记录一下登录状态呢?

用户登录

登录状态的记录方式有很多种,首先想到的应该就是使用flask自带的session,但flask还提供了一种更方便的扩展,即flask-login包,使用方式还和之前一样,首先需要安装:

pip3.6 install flask-login

然后在default.py中进行初始化:

from flask.ext.login import LoginManager

......

login_manager=LoginManager()
login_manager.session_protection="strong" 

#可设置为None,basic,strong已提供不同的安全等级
login_manager.login_view="login" #设置登录页

然后按照需求对User模型进行修改,因为Flask-Login要求User模型必须实现四个方法,分别为:

is_authenticated() 判断是否登录,登录返回True,否则返回False
is_active() 是否允许登录,即用户是否已被禁用,如禁用返回False
is_anonymous() False为普通用户
get_id() 返回用户唯一标识符,使用Unicode编码

这四个方法在User模型中直接实现即可,但是还有一种更简单的方式,即继承Flask-Login提供的UserMixin类,它里边包含了这些方法的默认实现,修改后的User模型为:

from flask.ext.login import UserMixin

class User(UserMixin,db.Model):
  __tablename__="users"
  id=db.Column(db.Integer,primary_key=True)
  ......

flask-login还要求程序实现一个回调函数,已使用指定的标识符家在用户:

@login_manager.user_loader
def load_user(user_id):
  return User.query.get(int(user_id))

之后,就可以方便的使用flask-login框架,继续修改首页模板的导航部分,以便显示用户名及相应信息:

{%extends "bootstrap/base.html "%}
{% block title%}牛博客 {% endblock %}<!--覆盖title标签-->

{% block navbar %}
<nav class="navbar navbar-inverse"><!-- 导航部分 -->
 <div class="navbar-header">
   <a class="navbar-brand" href="#" rel="external nofollow" rel="external nofollow" >
    牛博客
   </a>
 </div>

 <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
   <ul class="nav navbar-nav">
    <li><a href="/" rel="external nofollow" >首页</a></li>
   </ul>
   <ul class="nav navbar-nav navbar-right">
    {% if current_user.is_authenticated %}
      <li><p class="navbar-text"><a href="#" rel="external nofollow" rel="external nofollow" class="navbar-link">{{current_user.username}}</a> 您好</p></li>
      <li><a href="{{url_for('logout')}}" rel="external nofollow" >登出</a></li>
    {% else %}
      <li><a href="{{url_for('login')}}" rel="external nofollow" >登录</a></li>
    {% endif %}
   </ul>
  </div><!-- /.navbar-collapse -->
</nav>
{% endblock %}
{% block content %} <!--具体内容-->
<div class="container">
</div>
{% endblock %}

这里新出现url_for方法,它的主要功能是使用程序中的信息生成URL,比如传入视图的方法名,生成对应的url,还可以通过方法的动态参数生成url的参数,如url_for('index',age=5)结果为/?age=5

主要内容为判断是否登录,若登录显示 {{用户名}}你好,并提供登出功能,否则显示登录链接。

修改登录表单:

class LoginForm(Form):
  username=StringField("请输入用户名",validators=[DataRequired()])
  password=PasswordField("请输入密码")
  remember_me=BooleanField("记住我")
  submit=SubmitField("登录")

增加记住我项目, BooleanField默认为多选按钮

修改登录视图方法:

@app.route("/login",methods=["GET","POST"])
def login():
  form=LoginForm()
  if form.validate_on_submit():
    username = form.username.data
    password = form.password.data
    user = User.query.filter_by(username=username, password=password).first()
    if user is not None:
      login_user(user,form.remember_me.data)
      return redirect(url_for("index"))
    else:
      flash("您输入的用户名或密码错误")
      return render_template("/login.html",form=form) # 返回的仍为登录页
  return render_template("/login.html",form=form)

其中login_user为flask_login插件提供,用于设置用户登录,其中第二个参数即为记住我选项,若输入True,则提供cookie存储状态,否则关闭浏览器状态即取消

新增登出方法:

@app.route("/logout",methods=["GET","POST"])
@login_required
def logout():
  logout_user()
  return redirect(url_for("index"))

此方法很简单,直接使用flask-login提供的登出方法即可,注意@login_required装饰器表示,只有登录用户才可访问此视图方法。

运行测试一下,输入首页地址:

一个基于flask的web应用诞生 记录用户账户登录状态(6)

点击右上角的登录键:

一个基于flask的web应用诞生 记录用户账户登录状态(6)

输入用户名zhangji 密码123 并选择记住我,点击确定:

一个基于flask的web应用诞生 记录用户账户登录状态(6)

注意红线部分,显示正常,此时点击登出:

一个基于flask的web应用诞生 记录用户账户登录状态(6)

注意红线部分,回到初始状态。

章节结语

接下来本来应该是发帖及关注功能,但很明显,现在代码都在default.py中,对于代码结构越来越力不从心,所以本章的篇幅比较小,下一章将重点对已有代码进行重构,并对功能进行分组,然后在继续写接下来的功能。谢谢观看。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用IronPython把Python脚本集成到.NET程序中的教程
Mar 31 Python
python中__call__内置函数用法实例
Jun 04 Python
Python爬虫模拟登录带验证码网站
Jan 22 Python
玩转python爬虫之爬取糗事百科段子
Feb 17 Python
Python线性方程组求解运算示例
Jan 17 Python
python自动化报告的输出用例详解
May 30 Python
python爬虫之线程池和进程池功能与用法详解
Aug 02 Python
通过python爬虫赚钱的方法
Jan 29 Python
Python中PyQt5/PySide2的按钮控件使用实例
Aug 17 Python
python模拟实现斗地主发牌
Jan 07 Python
Python如何使用ConfigParser读取配置文件
Nov 12 Python
python实现过滤敏感词
May 08 Python
一个基于flask的web应用诞生 用户注册功能开发(5)
Apr 11 #Python
一个基于flask的web应用诞生 flask和mysql相连(4)
Apr 11 #Python
一个基于flask的web应用诞生 bootstrap框架美化(3)
Apr 11 #Python
一个基于flask的web应用诞生 使用模板引擎和表单插件(2)
Apr 11 #Python
非递归的输出1-N的全排列实例(推荐)
Apr 11 #Python
一个基于flask的web应用诞生(1)
Apr 11 #Python
Python 文件处理注意事项总结
Apr 10 #Python
You might like
咖啡豆要不要放冰箱的原因
2021/03/04 冲泡冲煮
国产PHP开发框架myqee新手快速入门教程
2014/07/14 PHP
微信公众号开发之获取位置信息php代码
2018/06/13 PHP
Laravel 中使用简单的方法跟踪用户是否在线(推荐)
2019/10/30 PHP
JavaScript获得选中文本内容的方法
2008/12/02 Javascript
window.name代替cookie的实现代码
2010/11/28 Javascript
经过绑定元素时会多次触发mouseover和mouseout事件
2014/02/28 Javascript
JS获取鼠标坐标并且根据鼠标位置不同弹出不同内容
2017/06/12 Javascript
Vuex 单状态库与多模块状态库详解
2018/12/11 Javascript
详解基于electron制作一个node压缩图片的桌面应用
2019/01/29 Javascript
vue中在vuex的actions中请求数据实例
2019/11/08 Javascript
Vue通过for循环随机生成不同的颜色或随机数的实例
2019/11/09 Javascript
js实现圆形显示鼠标单击位置
2020/02/11 Javascript
微信小程序:报错(in promise) MiniProgramError
2020/10/30 Javascript
Vue使用Proxy代理后仍无法生效的解决
2020/11/13 Javascript
python进阶教程之文本文件的读取和写入
2014/08/29 Python
python类和函数中使用静态变量的方法
2015/05/09 Python
Python实现保证只能运行一个脚本实例
2015/06/24 Python
在Python的Django框架中创建和使用模版
2015/07/15 Python
Python 常用string函数详解
2016/05/30 Python
Python中字符串格式化str.format的详细介绍
2017/02/17 Python
Python中.py文件打包成exe可执行文件详解
2017/03/22 Python
python MysqlDb模块安装及其使用详解
2018/02/23 Python
Python实现的端口扫描功能示例
2018/04/08 Python
flask中过滤器的使用详解
2018/08/01 Python
python RabbitMQ 使用详细介绍(小结)
2018/11/08 Python
对python数据切割归并算法的实例讲解
2018/12/12 Python
python 使用装饰器并记录log的示例代码
2019/07/12 Python
Python 3 判断2个字典相同
2019/08/06 Python
python 多进程队列数据处理详解
2019/12/23 Python
python有序查找算法 二分法实例解析
2020/02/18 Python
医药工作岗位求职信分享
2013/12/31 职场文书
精彩的广告词
2014/03/19 职场文书
小城镇建设汇报材料
2014/08/16 职场文书
农行心得体会
2014/09/02 职场文书
图解上海144收音机
2021/04/22 无线电