Flask博客实战 – 实现登录注册功能

Flask博客实战 - 实现登录注册功能

上一节我们已经创建了一个用户应用,并创建了用户模型,那么我们这节就开始实现一个简单的用户登录注册功能!

登录注册功能Flask有一个非常优秀的扩展Flask-login,我们可以选择使用这个扩展来实现,但为了学习我们暂时不使用这个第三方扩展,而是选择使用session来实现!

实现用户的登录功能

首先,我们需要完善登录的html页面, 路径为:app/auth/templates/login.html

{% extends ‘base.html’ %}{% block title %} 登录页 {% endblock title %}{% block hero %}{% endblock hero %}{% block main %} {% block auth_form %} {% endblock auth_form %} {% endblock main %}

代码详解:

这个登陆模板继承了base.html的样式,这个base.html中的模块及代码其实就是我们之前实现的首页,只是我们把他作为一个模板基类来继承他!

这段代码中其实就是写了一个输入账号密码的表单,其他多余的代码都是为了实现表单的样式而存在的!

这里要特别说明的是这个input表单必须设置name属性,因为后端要根据此name属性来获取用户输入的值!其他属性则需要大家自行去了解学习!

登录功能的后端逻辑视图, 路径为:app/auth/views/auth.py

@bp.route(‘/login’, methods=[‘GET’, ‘POST’])def login(): # 登录视图 if request.method == ‘POST’: username = request.form[‘username’] password = request.form[‘password’] error = None user = auth.User.query.filter_by(username=username).first() if user is None: error = ‘该用户不存在!’ elif not check_password_hash(user.password, password): error = ‘密码不正确.’ if error is None: session.clear() session[‘user_id’] = user.id return redirect(url_for(‘index’)) flash(error) return render_template(‘login.html’)

代码详解: – request.method == ‘POST’判断当前请求是否为post请求方式 – error = None 来初始化一个错误变量,如果未通过登录验证,把错误信息通过消息传送到页面提示用户

user = auth.User.query.filter_by(username=username).first()if user is None: error = ‘该用户不存在!’elif not check_password_hash(user.password, password): error = ‘密码不正确.’

这段代码首先在数据库通过用户提交的用户名去查询该用户,用户不存在就会返回None返回错误提示,用户存在则判断密码是否正确,这里用到了一个check_password_hash()的方法,这是用来将密文密码解密后与用户输入密码比对方法,与之对应的有一个generate_password_hash()的方法用来加密明文密码保存到数据库!

if error is None: session.clear() session[‘user_id’] = user.id return redirect(url_for(‘index’))flash(error)

这段代码则是如果没有返回任何错误提示,说明该提交的表单符合我们的要求,并且数据库也存在该用户信息,那么我们只需要清空session,重新将session中的user_id设置为当前登录的id即可!

因此在实现登录注册逻辑之前就必须引入这两个方法:

from werkzeug.security import check_password_hash, generate_password_hash

登录功能虽然实现了,但我们数据库目前还没有任何一个用户,所以此时就应该要去实现用户的注册功能,向数据库新增用户,大概的逻辑是,用户输入用户名及两次密码,先判断该用户是否已经存在,存在则提示更换用户名,不存在则向数据库创建该用户信息,并清空session,重新设置user_id的值为注册用户的id,以达到注册成功后自动登录的目的!

实现用户的注册功能

首先,我们需要完善注册的html页面, 路径为:app/auth/templates/register.html

{% extends ‘login.html’ %}{% block title %}注册{% endblock title %}{% block auth_form %}{% endblock auth_form %}

这是注册页面的html,大家自行理解下,这里着重说一个我们在视图中通过flash()传递出来的消息,在模板中由以下代码接收!

{% with messages = get_flashed_messages() %} {% if messages %}

    {% for message in messages %}

  • {{ message }}
  • {% endfor %}

{% endif %} {% endwith %}

注册功能的后端逻辑视图, 路径为:app/auth/views/auth.py

@bp.route(‘/register’, methods=[‘GET’, ‘POST’])def register(): # 注册视图 if request.method == ‘POST’: username = request.form[‘username’] password = request.form[‘password’] password1 = request.form[‘password1’] if password != password1: flash(‘两次密码输入不一致!’) return redirect(url_for(‘auth.register’)) exists_user = auth.User.query.filter_by(username=username).first() if exists_user: flash(‘该用户名已经存在,请更换其他用户名!’) return redirect(url_for(‘auth.register’)) else: user = auth.User(username=username, password=generate_password_hash(password)) db.session.add(user) db.session.commit() session.clear() session[‘user_id’] = user.id return redirect(url_for(‘index’)) return render_template(‘register.html’)

这个注册的逻辑基本上涵盖了我们之前所有章节学到的知识点,这里就不再过多地去一一解释代码,大家可自行理解并完善注释!

实现用户退出登录功能

通过登录和注册功能的实现,我们已经清楚地知道,用户是否登录其实是判断session会话中是否存在用户的id来决定,那么推出登录,我们只需要清除session会话中的用户id即可,这里我们直接选择清空session的方式实现推出功能!

@bp.route(‘/logout’)def logout(): # 注销 session.clear() return redirect(url_for(‘index’))

在模板中获取用户信息

@bp.before_app_requestdef load_logged_in_user(): # 每个请求之前都回去session中查看user_id来获取用户 user_id = session.get(‘user_id’) if user_id is None: g.user = None else: g.user = auth.User.query.get(int(user_id))

bp.before_app_request()注册一个在视图函数之前运行的函数,无论请求什么 URL。 都会先检查用户 ID 是否存储在会话中,并从数据库获取该用户的数据,将其存储在 g.user 上,该数据在请求期间持续。

注册完这个函数之后,我们就可以在base.html中的导航的最右侧通过g.user的返回值,判断用户是否已经登录,显示不同的信息!

{% block navbar %} Home … 省略部分代码 {% if g.user %} 欢迎您 {{ g.user[‘username’] }} 个人中心 退出 {% else %} Sign up Log in {% endif %} {% endblock navbar %}

实现login_required装饰器

对于像下一章节我们要实现的用户中心以及管理后台,则必须是带有权限的访问,最基本的权限应该是必须是登录用户,那么所以说对于那些未登录的用户我们需要拒绝访问的功能!

这个其实思路也非常简单,既然在实现模板中调用用户信息的时候,我们把当前登录的用户信息添加到了g对象,那么我们只需要判断g.user的返回值是否为None即可判断用户是否登陆!

def login_required(view): # 限制必须登录才能访问的页面装饰器 @functools.wraps(view) def wrapped_view(**kwargs): if g.user is None: return redirect(url_for(‘auth.login’)) return view(**kwargs) return wrapped_view

到这里关于用户登录注册相关的基本权限问题我们就完成了,注意这些视图函数都在app/auth/views/auth.py文件中!

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
用户投稿
上一篇 2022年6月21日 06:45
下一篇 2022年6月21日 06:45

相关推荐

  • ios手游模拟器(手游模拟器ios)

    本文主要讲的是ios手游模拟器,以及和手游模拟器ios相关的知识,如果觉得本文对您有所帮助,不要忘了将本文分享给朋友。 哪个iOS模拟器能多开手游账号?可以推荐个好用的模拟器给我吗…

    2022年11月27日
  • 短视频策划内容的3个要点(短视频策划内容怎么做)

    短视频在制作时,内容框架非常重要。如果直奔主题,然后结束,聚卓告诉你,这样的短视频已经过时了。现在的短视频需要框架的,但不是任何框架,它需要一种易于理解和消化的框架。而且,现在大多…

    2022年11月27日
  • 美团第三季度实现营收626亿元,即时配送订单量增至50亿笔

    新京报讯(记者秦胜南)11月25日,美团发布业绩公告显示,第三季度营收为626亿元,较去年同比增长28.2%,净利润为12.2亿元。第三季度,美团即时配送订单数增长至50亿笔。截至…

    2022年11月27日
  • 个人怎么做抖音带货(个人做抖音带货能赚钱吗)

    抖音如今是大家很熟悉的短视频平台,不过现在的抖音却不只是短视频那么简单,它的功能非常丰富,其中一个就是可以带货,相信很多小伙伴都有在抖音上买过东西,抖音如今的变现能力也是不容小觑的…

    2022年11月25日
  • 全民K歌升级新版本7.0之后,有哪些隐藏功能?

    作者:高百烈来源:知乎 这个功能,旧版并没有,要升级到全新的全民K歌7.0版本才能发现。 作为朋友圈当代K歌之王,我费了不少功夫才抢到内测版本。有一说一,全民K歌的路子真的很野,新…

    2022年11月25日
  • 拼多多百亿补贴预售一般多久发货(拼多多百亿补贴预售)

    拼多多里面有很多优惠活动,其中百亿补贴活动非常火爆,一些里面的东西价格比别的平台便宜,质量也有保障,还有预售的活动,那么拼多多百亿补贴预售一般多久发货?下面小编为大家带来拼多多百亿…

    2022年11月25日
  • 上手Reno8 Pro体验跨屏互联 实在太方便!

    11月已经来到了月底,在手机品牌又要推出新一年度的新品手机之前,我们来点评一下今年令人惊喜的产品。如OPPO的Reno8 Pro系列,该系列搭载双芯影像配置获得了很多消费者的认可。…

    2022年11月25日
  • 小红书平台的一些机制及玩法详解(小红书玩法有哪些)

    关于小红书 一:小红书平台的一些机制 1. 笔记内容的CES评分机制 2. 笔记流量入口与长尾效应 二:小红书优质笔记的特点(分维度、类型分析) 1.笔记的本身架构组成 维度 2.…

    2022年11月25日
  • 百度关键词快速排名的4大原理解析(百度怎么刷关键词)

    近期百度公告惊雷算法2.0,升级之快还是第一次吧,看来百度对于刷点击行为是零容忍了。之前尹华峰SEO技术博客介绍过一篇如何使用刷点击工具,其实市面上有很多这类SEO快速排名的软件,…

    2022年11月25日
  • 2022全球最常用密码名单:password成全球最常用密码

    11月24日消息,据IT之家报道,密码管理工具NordPass现已发布2022年全球最常用的密码名单,结果显示用户仍在使用众所周知的弱密码。统计数据显示,今年全球最常见的密码是“p…

    2022年11月25日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息