美文网首页
一个web应用的诞生(6)--用户账户

一个web应用的诞生(6)--用户账户

作者: 双鱼座的牛 | 来源:发表于2017-06-08 00:13 被阅读0次

之前登录注册的功能都已经完成,但是登录成功回到首页发现还是白茫茫的一片,对的,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)--用户账户

    之前登录注册的功能都已经完成,但是登录成功回到首页发现还是白茫茫的一片,对的,title一直都写得博客,那么最终目...

  • 探索越权漏洞的自动化检测方式-2019-05-23

    0x01 背景 在Web应用中是很常见的安全漏洞,比如:低权限账户越权到高权限账户进行越权操作、A用户越权到B用户...

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

    在开始之前,我们首先根据之前的内容想象一个场景,用户张三在网上浏览,看到了这个轻博客,发现了感兴趣的内容,于是想要...

  • UNIX基础--用户和基本账户管理

    账户类型 系统账户 系统账户运行服务。系统用户是那些要使用诸如DNS、 邮件, web等服务的用户。 使用帐户的原...

  • JAVA Web基础学习---JSP(一)

    Web应用程序是一种可以通过Web访问的应用程序。Web应用程序的一个最大好处是用户很容易访问应用程序。用户只需要...

  • 01_web_http简介

    一、web应用 Web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需...

  • 简介

    ThinkPHP是一个开源的PHP框架,是为了简化企业级应用开发和敏捷WEB应用开发而诞生的。最早诞生于2006年...

  • SpringBootSecurity学习(01)网页版登录入门介

    Web应用安全管理 Web应用的安全管理,主要包括两个方面的内容,一个是用户身份的认证,即用户登录的设计,二是用户...

  • 6. Web应用程序Django2——用户账户1

    1. 让用户能够输入数据 添加几个页面,让用户能够输入数据,能够添加新主题,添加新条目以及编辑既有条目 只有超级用...

  • 逻辑漏洞之越权

    越权漏洞的产生 越权漏洞是Web应用程序中一种常见的安全漏洞。它的威胁在于一个账户即可控制全站用户数据。当然这些数...

网友评论

      本文标题:一个web应用的诞生(6)--用户账户

      本文链接:https://www.haomeiwen.com/subject/mgczfxtx.html