Flask是什么?

Flask是一个Python编写的web框架,可以使用Python语言实现一个网站或者web服务,核心依赖是2个外部库: Jinja2 模板引擎和 WSGI工具集(Werkzeug),Flask的使用特点是具有各种扩展,Flask只保留了web开发的核心功能,扩展功能的添加,是以外部库的方式引用。

Flask性能满足一般web开发的需求, 并且灵活性以及可扩展性上要优于其他web框架, 对各种数据库的契合度都非常高,支持MSSQL,MySQL,Oracle等。

本文将展示如何编写一个登录站点,通过验证后,访问后端内容。

flask登录需要使用flask-login实现,flask-login通过 user session,提供登录的常见任务,比如登入 (logging in)、登出 (logging out) 和当前用户 (current user).

Flask-login 函数

  1. login_user() 函数:实现用户的登入,一般在登入的视图函数中调用;
  2.  logout_user() 函数:实现登出功能;
  3. current_user 属性:获取当前用户;
  4. @login_required 装饰器,对于使用者来说,如果需要页面是授权用户才可见,在相应视图函数前加上 进行声明即可,@login_required 装饰器对于未登录用户访问,默认处理是重定向到LoginManager.login_view 所指定的视图.


定义User

登录基于用户,需要定义 User 类,Flask-Login 规定 User 类必须实现三个属性和一个方法:

is_authenticated 属性

is_active 属性

is_anonymous 属性

get_id() 方法


使用UserMixin 类,可以简化配置步骤.

建议采用外部数据库维护账户信息,避免账户数据风险,本次仅做演示!!!

from flask import Flask, request, flash, render_template, redirect
from flask_login import UserMixin

class User(UserMixin):
    pass

users = [
    {'id':'101', 'username': 'ciscoskys1', 'password': '111222'},
    {'id':'102', 'username': 'ciscoskys2', 'password': '222444'}
]
#简化配置账户信息,写入代码,或者使用数据库动态查询账户信息

def query_user(user_id):
    for user in users:
        if user_id == user['id']:
            return user

应用程序配置

from flask_login import LoginManager,login_required, logout_user, login_user, current_user

#创建loginmanager实例,绑定app

login_manager = LoginManager()
login_manager.login_view = 'login'
login_manager.login_message_category = 'info'
login_manager.login_message = 'Access denied. Please login.'
login_manager.init_app(app)

回调user函数

"""
user session 记录的是用户 ID (user_id),回调函数的作用就是通过 user_id 返回对应的 User 对象
user_loader 回调函数在 user_id 非法的时候不应该抛出异常,而要返回 None。没有这个回调函数的话,Flask-Login 无法正常运行

"""


@login_manager.user_loader
def load_user(user_id):
    if query_user(user_id) is not None:
        curr_user = User()
        curr_user.id = user_id

        return curr_user

Login功能 实现

"""
关键语句是 login_user(curr_user) ,之前要构建 User 对象,并指定 id
"""


@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        user_id = request.form.get('userid')
        user = query_user(user_id)
        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)

            return redirect(url_for('index'))

        else:
            tm_login = time.strftime(
                    "%Y-%m-%d %H:%M:%S", time.localtime())  # 当前运行时间
                flash('ERROR:\t' + 'Wrong username or password!' + '\t' + str(tm_login))
                return render_template('login1.html', error=error)

    # GET 请求
    return render_template('login.html')

Logout功能实现

@app.route('/logout')
@login_required
def logout():
    logout_user()
    return 'Logged out successfully!'

登录界面

采用Flask创建授权访问的echarts可视化数据网站_python

采用Flask创建授权访问的echarts可视化数据网站_flask_02