使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用

使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化

使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(三)——使用Flask-Login库实现登录功能

使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(四)——对 run.py 的调整

使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(五)——实现注册功能

本次示例的源码下载:点击下载

Flask-Login 库的中文文档:点击进入

Flask-Login 库的新版英文文档:点击进入

使用 WTForms 进行表单验证:点击进入

 

一、导入并初始化 Flask-Login 库

在项目根目录下的/demo/__init__.py 文件的头部,import 进 flask_login 库

from flask_login import LoginManager

在 create_app 函数的前面加入初始化操作:

"""
初始化登录管理器
"""
login_manager = LoginManager() """
这里的参数格式是:蓝图名称.函数名
这里是指定了当用户未登录的时候,进入需要登录才能进入的页面时,会自动跳转到的页面。
"""
login_manager.login_view = "user.login"

在 create_app 函数中的 app = Flask(__name__) 下面加入:

login_manager.init_app(app)

完整的代码是:

二、实现登录模块

1.增加 MD5 加密公共函数

在该路径下创建文件并编写以下代码:

/demo/common/encrypt.py

def md5(text):
import hashlib
m = hashlib.md5()
t = text.encode(encoding="utf-8")
m.update(t)
return m.hexdigest()

2.创建用户模块

①创建以下目录

/demo/modules/users

/demo/modules/users/forms

/demo/modules/users/models

/demo/modules/users/templates

②创建 /demo/modules/users/views.py

3.使用 Flask-WTF 库来验证提交的表单,点击查看文档

在 forms 目录下 创建 users.py 文件,做登录表单验证

/demo/modules/users/forms/users.py

# config=utf-8
from flask_wtf import Form
from wtforms import StringField, PasswordField
from wtforms.validators import DataRequired, Length, Email class LoginForm(Form):
accountNumber = StringField('accountNumber', validators=[DataRequired('账号不可以是空的'),
Length(-1, 200, '账号的字符数不可以超过 200 个'),
Email('账号只能是邮箱')])
password = PasswordField('password', validators=[DataRequired('密码不可以是空的'),
Length(6, 20, '密码的字符数只能在 6 - 20 个之间')])

4.创建操作数据库类

/demo/modules/users/models/users.py

# config=utf-8
from flask_login import UserMixin
from demo.common import db class User(db.Model, UserMixin):
"""
用户实体信息
Attributes:
id:用户编号。
accountNumber:账号。
password:密码。
name:用户昵称。
"""
id = db.Column(db.Integer, primary_key=True)
accountNumber = db.Column(db.String(200), unique=True)
password = db.Column(db.String(50), unique=True)
name = db.Column(db.String(20), unique=True) __tablename__ = 'py_user' def __init__(self, user_id=None, account_number=None, password=None, name="anonymous"):
"""
初始化用户信息。
Args:
user_id (int): 用户编号
account_number(string):账号
password(string):密码
name (string):昵称
"""
self.id = user_id
self.accountNumber = account_number
self.password = password
self.name = name

db.Model 类是数据库操作类,实现了数据库的功能。

UserMixin 是 flask-login 库提供的一个用户的基类,定义了 flask-login 的登录用户必需使用到的属性和方法等。

5.在 views.py 中实现具体的登录功能。

/demo/modules/users/views.py 的完整代码

# config=utf-8
from flask import Blueprint, request, redirect, url_for
from flask import render_template
from flask_login import login_user, logout_user
from demo import login_manager
from demo.common.encrypt import md5
from demo.modules.users.models.users import User
from demo.modules.users.forms.users import LoginForm userRoute = Blueprint('user', __name__, url_prefix='/user', template_folder='templates', static_folder='static') @login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id)) @userRoute.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm() if request.method == 'POST':
if not form.validate_on_submit():
return render_template('login.html', form=form) user = User.query.filter(User.accountNumber == form.accountNumber.data,
User.password == md5(form.password.data)).first() if user:
login_user(user)
return redirect("/") return render_template('login.html', form=form) @userRoute.route('/logout')
def logout():
logout_user()
return redirect(url_for('.login'))

其中,要以 @login_manager.user_loader 来描述一个函数,表示 flask-login 库在获取当前已登录的用户信息时,会该用该函数来获取:

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

6.注册用户模块,在 /run.py 文件里增加:

from demo.modules.home.views import homeRoute
from demo.modules.users.views import userRoute DEFAULT_MODULES = [homeRoute,
userRoute]

/run.py 完整代码:

# config=utf-8
from demo import create_app
from demo.modules.home.views import homeRoute
from demo.modules.users.views import userRoute DEFAULT_MODULES = [homeRoute,
userRoute] app = create_app('config.py') for module in DEFAULT_MODULES:
app.register_blueprint(module) @app.before_request
def before_request():
"""
这里是全局的方法,在请求开始之前调用。
其中 flask 有个全局的变量 g,它是和 session 一样的用途,可以使用它来保存当前用户的数据
Returns: """
pass if __name__ == '__main__':
app.run()

7.创建模板页面

①创建以下目录:

/demo/static

/demo/static/js

/demo/static/css

/demo/static/img

分别用于保存 JS、CSS 和图片。

页面调用的静态文件的目录是应用目录下的 static 目录,如果将这些文件放到其它目录中 ,则无法在页面中引用。

②下载 jquery 并保存在/static/js/jquery/目录下

/static/js/jquery/jquery-2.2.0.min.js

③在 /demo/templates/base.html 中引入 jquery:

<!DOCTYPE html>
<html lang="cn">
<head>
<meta charset="UTF-8">
<title>{% block title %}{% endblock %}</title>
<script src="/static/js/jquery/jquery-2.2.0.min.js"></script>
{% block head %}{% endblock %}
</head>
<body>
{% block content %}{% endblock %}
</body>
</html>

④在 /demo/modules/users/templates 目录创建 login.html 页面:

{% extends "base.html" %}
{% block title %}python flask user page{% endblock %}
{% block head %}
<style type="text/css"></style>
{% endblock %}
{% block content %}
<form action="{{ url_for('user.login') }}" method="post">
{% if form.errors %}
<ul>
{% for name, errors in form.errors.items() %}
{% for error in errors %}
<li>{{ error }}</li>
{% endfor %}
{% endfor %}
</ul>
{% endif %}
账号:{{ form.accountNumber(size=20) }}<label>{{ form.accountNumber.errors[0] }}</label><br/>
密码:<input name="password" type="password"/><br/>
{{ form.hidden_tag() }}
<button type="submit">登录</button>
</form>
<a href="/">返回</a>
{% endblock %}

其中这段表示遍历输出所有表单错误信息。

        {% if form.errors %}
<ul>
{% for name, errors in form.errors.items() %}
{% for error in errors %}
<li>{{ error }}</li>
{% endfor %}
{% endfor %}
</ul>
{% endif %}

完成了,这几章只是对在 Flask 使用中的一种补充和记录,具体还是查文档。

使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(三)——使用Flask-Login库实现登录功能的更多相关文章

  1. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(五)——实现注册功能

    使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...

  2. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(四)——对 run.py 的调整

    使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...

  3. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用

    使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...

  4. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化

    使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...

  5. Flask框架获取用户IP地址的方法

    本文实例讲述了python使用Flask框架获取用户IP地址的方法.分享给大家供大家参考.具体如下: 下面的代码包含了html页面和python代码,非常详细,如果你正使用Flask,也可以学习一下最 ...

  6. restframework框架写api中的个人理解以及碰到的问题

    1.明确处理对象,在restframework的处理过程当中,如果是针对model写视图的话,queryset是要待展示的对象集,serializer_class是对每一个对象的所要使用的处理方式. ...

  7. 编写简单登陆和注册功能的demo时遇到的问题

    一.注册功能中添加数据不成功 给数据库添加EditText中的内容后,数据库中找不到添加后的数据,并且存在字符串为空的数据 解决方法:EditText registerAccount = (EditT ...

  8. 用 Flask 来写个轻博客 (25) — 使用 Flask-Principal 实现角色权限功能

    目录 目录 前文列表 扩展阅读 Flask-Principal 使用 Flask-Principal 来实现角色权限功能 添加 Role Model 在 Manager shell 中手动的添加角色 ...

  9. 用 Flask 来写个轻博客 (30) — 使用 Flask-Admin 增强文章管理功能

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 实现文章管理功能 实现效果 前文列表 用 Flask 来写个 ...

随机推荐

  1. C# BackgroundWorker 的使用、封装

    示例代码: PT_USER_INFO user = new PT_USER_INFO(); IList<TES_COMBAT_TASK> taskList = new List<TE ...

  2. 2018-2019-2 20165219《网络对抗技术》Exp4 恶意代码分析

    基础问题回答 实验目的 监控系统的运行状态,看有没有可疑的程序在运行 分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分析工具尽量使用原生指令或sysinternals,systracer套 ...

  3. jquery改造轮播图1

    g改造轮播图1:https://www.cnblogs.com/huanghuali/p/8677338.html <!DOCTYPE html> <html lang=" ...

  4. AngularJS入门讲解4:多视图,事件绑定,$resource服务讲解

    上一课,大家知道,手机详细模板我们没有写出来,使用的是一个占位模板. 这一课,我们先实现手机详细信息视图,这个视图会在用户点击手机列表中的一部手机时被显示出来. 为了实现手机详细信息视图,我们将会使用 ...

  5. Java 文件本地上传、下载和预览的实现

    以下方法为通用版本 实测图片和pdf 都没有问题 上传方法需要前端配合post请求 ,下载前端用a标签就可以,预览 前端使用ifrme标签   ,就可以实现基本功能... 1.文件本地上传 publi ...

  6. 算法导论-MIT笔记

    第一部分 Analysis of Algorithms 算法分析是关于计算机程序性能(performance)和资源利用的理论研究 1 What's more important than perfo ...

  7. GPS坐标转百度地图坐标

    百度地图提供了相关API:BMap.Convertor.translate, 但是使用上存在部分限制:1.次数限制:2.异步回调 可以用如下方法: /** * 地图位置计算工具(将GPS坐标转换成百度 ...

  8. 老男孩Day12作业:RabbitMQ-RPC版主机管理程序

    一.作业需求 1.可以对指定机器异步的执行多个命令 例子: 请输入操作指令>>>:run ipconfig --host 127.0.0.0 in the call     tack ...

  9. 火狐浏览器下,td 直接使用position:relative;和background:;产生的边框消失问题

    消失示例: td{ width:40px; height:28px; position:relative; background:#ccc; } 出现问题 问题原因: 我的理解是各个浏览器之间对于ba ...

  10. ElasticSearch 系列随笔

    1.ElasticSearch 常用设置 2.ElasticSearch 从2.2升级到6.2.4碰到的问题 3.ElasticSearch 因为磁盘空间不够引起的数据插入错误.(message [C ...