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

本次示例的源码下载:

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)

完整的代码是:

eeef292598dd8a42923435b999a19227.png

二、实现登录模块

1.增加 MD5 加密公共函数

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

/demo/common/encrypt.py

defmd5(text):importhashlib

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 importFormfrom wtforms importStringField, PasswordFieldfrom wtforms.validators importDataRequired, Length, EmailclassLoginForm(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 importUserMixinfrom demo.common importdbclassUser(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 importBlueprint, request, redirect, url_forfrom flask importrender_templatefrom flask_login importlogin_user, logout_userfrom demo importlogin_managerfrom demo.common.encrypt importmd5from demo.modules.users.models.users importUserfrom demo.modules.users.forms.users importLoginForm

userRoute= Blueprint('user', __name__, url_prefix='/user', template_folder='templates', static_folder='static')

@login_manager.user_loaderdefload_user(user_id):returnUser.query.get(int(user_id))

@userRoute.route('/login', methods=['GET', 'POST'])deflogin():

form=LoginForm()if request.method == 'POST':if notform.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()ifuser:

login_user(user)return redirect("/")return render_template('login.html', form=form)

@userRoute.route('/logout')deflogout():

logout_user()

return redirect(url_for('.login'))

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

@login_manager.user_loaderdefload_user(user_id):return User.query.get(int(user_id))

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

from demo.modules.home.views importhomeRoutefrom demo.modules.users.views importuserRoute

DEFAULT_MODULES=[homeRoute,

userRoute]

/run.py 完整代码:

#config=utf-8

from demo importcreate_appfrom demo.modules.home.views importhomeRoutefrom demo.modules.users.views importuserRoute

DEFAULT_MODULES=[homeRoute,

userRoute]

app= create_app('config.py')for module inDEFAULT_MODULES:

app.register_blueprint(module)

@app.before_requestdefbefore_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:

{% block title %}{% endblock %}

{% block head %}{% endblock %}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值