之前登录注册的功能都已经完成,但是登录成功回到首页发现还是白茫茫的一片,对的,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="#">
牛博客
</a>
</div> <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li><a href="/">首页</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
{% if current_user.is_authenticated %}
<li><p class="navbar-text"><a href="#" class="navbar-link">{{current_user.username}}</a> 您好</p></li>
<li><a href="{{url_for('logout')}}">登出</a></li>
{% else %}
<li><a href="{{url_for('login')}}">登录</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装饰器表示,只有登录用户才可访问此视图方法。

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

点击右上角的登录键:

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

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

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

章节结语

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

一个web应用的诞生(6)--用户账户的更多相关文章

  1. 一个web应用的诞生(1)--初识flask

    基于flask的web应用的诞生 Flask是一个非常优秀的web框架,它最大的特点就是保持一个简单而易于扩展的小核心,其他的都有用户自己掌握,并且方便替换,甚至,你可以在社区看到众多开源的,可直接用 ...

  2. 一个web应用的诞生(9)--回到用户

    在开始之前,我们首先根据之前的内容想象一个场景,用户张三在网上浏览,看到了这个轻博客,发现了感兴趣的内容,于是想要为大家分享一下心情,恩?发现需要注册,好,输入用户名,密码,邮箱,并上传头像后,就可以 ...

  3. 一个web应用的诞生(10)--关注好友

    下面回到首页中,使用一个账户登录,你肯定已经注意到了这里的内容: 没错,现在都是写死的一些固定信息,其中分享数量很容易就可以获取,只需要修改首页模板: <p class="text-m ...

  4. 一个web应用的诞生(13)--冲向云端

    有句话叫所有的乐趣都在部署之前,也许这个小应用还有很多缺陷,也许它还不够完美,但是,仔细想想,其实没有什么能比自己的网站在互联网中上线更令人满足的了,但是满足的背后,总是存在着很多的风险,以至于几乎所 ...

  5. 一个web应用的诞生--美化一下

    经过上一章的内容,其实就页面层来说已结可以很轻松的实现功能了,但是很明显美观上还有很大的欠缺,现在有一些很好的前端css框架,如AmazeUI,腾讯的WeUI等等,这里推荐一个和flask集成很好的b ...

  6. 一个web应用的诞生--数据表单

    下面把角色分为两种,普通用户和管理员用户,至少对于普通用户来说,直接修改DB是不可取的,要有用户注册的功能,下面就开始进行用户注册的开发. 用户表 首先要想好用户注册的时候需要提供什么信息:用户名.密 ...

  7. 一个web应用的诞生(8)--博文发布

    这个系统一直号称轻博客,但貌似博客的功能还没有实现,这一章将简单的实现一个博客功能,首先,当然是为数据库创建一个博文表(models\post.py): from .. import db from ...

  8. 一个web应用的诞生(11)--列表分页

    上章的结束,若在实际开发过程中,会发现一个问题,那就首页或关注分享,是一下子按时间顺序全部显示出来,这在实际项目中不可能出现的,想想实际中的产品是如何做的? 一般来说,无非是两种,一种是使用页码,来进 ...

  9. 一个web应用的诞生(3)--美化一下

    经过上一章的内容,其实就页面层来说已结可以很轻松的实现功能了,但是很明显美观上还有很大的欠缺,现在有一些很好的前端css框架,如AmazeUI,腾讯的WeUI等等,这里推荐一个和flask集成很好的b ...

随机推荐

  1. js div截取字符串的长度

    <div style="width:100%;" id="changdu">这个是字符串的长度</div> $("#chang ...

  2. iOS纯代码制作欢迎界面——UIScrollView, UIPageControl, UIImageView,UIButton, NSTimer

    欢迎界面,还是比较简单的,一个UIScrollView控件,一个UIPageControl,几个UIImageView即可摆平.在这里光玩这些,就显得诚意不足了.特意拓展一下,再加几个UIButton ...

  3. UIImageView控件

    UIImageView是用于显示图像的,在iOS开发中,我们无需专门去写什么代码,不需要检查设备的类型,只需要把1x.2x.3x的图像添加到项目中,图像视图会自动的在正确的时间加载正确的图像. (1) ...

  4. iOS8 UISearchViewController搜索功能讲解 分类: ios技术 2015-07-14 10:23 76人阅读 评论(0) 收藏

    在iOS8以前我们实现搜索功能需要用到UISearchbar和UISearchDisplayController, 在iOS8之后呢, UISearchController配合UITableView的 ...

  5. 基于libUSB的USB设备固件更新程序(下载数据)(转)

    源:基于libUSB的USB设备固件更新程序(下载数据) 本文紧接上一篇日志:基于libUSB-Win32的USB设备固件更新程序(前言),相关背景以及起因等,此处不再赘述,如感兴趣请移步. libU ...

  6. ios 自定义NSError

    from:[object-c错误处理]http://www.androiddev.net/objective-c%E5%AD%A6%E4%B9%A0%E4%B9%8B%E9%94%99%E8%AF%A ...

  7. IOS开发-UI学习-使用UIImageView控件制作动画

    先添加40张tomcat的图片到资源列表中:名称为cat_eat0000.jpg到cat_eat0039.jpg. 1.定义所需控件 // 定义按钮,图片控件.可变数组对象 UIButton *act ...

  8. css清除浮动大全,共8种方法

    我看的网页的网址:http://hi.baidu.com/kongcheng2012/item/2b1250d4452e802538f6f705 为什么浮动这么难? 因为浮动会使当前标签产生向上浮的效 ...

  9. HTML5学习笔记一:与html4的区别(整合)

    一 语法的改变 1.1 HTML5中标记方法 1.内容类型(ContentType):扩展符仍为“.html”或".htm",内容类型仍是“text/html”. 2.DOCTYP ...

  10. 避免Node.js中回调地狱

    为了解决这个阻塞问题,JavaScript严重依赖于回调,这是在长时间运行的进程(IO,定时器等)完成后运行的函数,因此允许代码执行经过长时间运行的任务. downloadFile('example. ...