一个基于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 相关文章推荐
Python基于pygame实现的font游戏字体(附源码)
Nov 11 Python
对numpy的array和python中自带的list之间相互转化详解
Apr 13 Python
Python实现聊天机器人的示例代码
Jul 09 Python
对tensorflow 的模型保存和调用实例讲解
Jul 28 Python
Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
Jan 04 Python
python元组的概念知识点
Nov 19 Python
numpy 返回函数的上三角矩阵实例
Nov 25 Python
Python接收手机短信的代码整理
Aug 02 Python
详解KMP算法以及python如何实现
Sep 18 Python
Python基础之数据结构详解
Apr 28 Python
Python开发简易五子棋小游戏
May 02 Python
Python实现信息管理系统
Jun 05 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
php简单定时执行任务的实现方法
2015/02/23 PHP
PHP的邮件群发系统phplist配置方法详细总结
2016/03/30 PHP
php传值方式和ajax的验证功能
2017/03/27 PHP
PHP后端银联支付及退款实例代码
2017/06/23 PHP
用JavaScript实现单继承和多继承的简单方法
2009/03/29 Javascript
javascript或asp实现的判断身份证号码是否正确两种验证方法
2009/11/26 Javascript
jQuery 源码分析笔记(2) 变量列表
2011/05/28 Javascript
IE6、IE7中setAttribute不支持class/for/rowspan/colspan等属性
2011/08/28 Javascript
验证手机号码的JS方法分享
2013/09/10 Javascript
jquery实现通用版鼠标经过淡入淡出效果
2014/06/15 Javascript
基于JS2Image实现圣诞树代码
2015/12/24 Javascript
图片旋转、鼠标滚轮缩放、镜像、切换图片js代码
2020/12/13 Javascript
AngularJS使用ng-options指令实现下拉框
2016/08/23 Javascript
js基础之DOM中元素对象的属性方法详解
2016/10/28 Javascript
微信小程使用swiper组件实现图片轮播切换显示功能【附源码下载】
2017/12/12 Javascript
NodeJs搭建本地服务器之使用手机访问的实例讲解
2018/05/12 NodeJs
iView-admin 动态路由问题的解决方法
2018/10/03 Javascript
vue安装遇到的5个报错及解决方法
2019/06/12 Javascript
JS实现随机抽选获奖者
2019/11/07 Javascript
vue 实现基础组件的自动化全局注册
2020/12/25 Vue.js
基于Django用户认证系统详解
2018/02/21 Python
使用Python开发SQLite代理服务器的方法
2018/12/07 Python
详细介绍Python进度条tqdm的使用
2019/07/31 Python
详解python中的数据类型和控制流
2019/08/08 Python
python 中xpath爬虫实例详解
2019/08/26 Python
pycharm中导入模块错误时提示Try to run this command from the system terminal
2020/03/26 Python
pytorch 移动端部署之helloworld的使用
2020/10/30 Python
HTML5 微格式和相关的属性名称
2010/02/10 HTML / CSS
HTML5在微信内置浏览器下右上角菜单的调整字体导致页面显示错乱的问题
2021/01/19 HTML / CSS
MAC彩妆英国官网:M·A·C UK
2018/05/30 全球购物
Oral-B荷兰:牙医最推荐的品牌
2020/02/25 全球购物
优秀应届毕业生推荐信
2014/02/18 职场文书
王老吉广告词
2014/03/20 职场文书
常务副总经理岗位职责
2014/04/12 职场文书
厨房领班竞聘演讲稿
2014/04/23 职场文书
【海涛dota解说】DCG联赛第一周 LGD VS DH
2022/04/01 DOTA