flask-web开发-用户认证代码分析(四)

本文介绍了使用Flask框架实现用户认证的过程,包括用户注册、登录、登出等功能,并详细讲解了如何通过表单验证和数据库操作确保用户信息的有效性和安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  理一下前几篇博文的思路.首先访问一个网页,进入的是首页,代码中是main.index一个简单的欢迎页面.这个页面需要forms.py表单并且渲染html,页面上可以跳转到注册和登录页面,那么就需views.py来提供跳转路径.假设我们已经注册,或者说数据库中已经有很多用户数据,那么对数据的调用,存储和修改都在modles.py.当用户登录时,views.py调用数据库中的用户信息来验证用户和密码是否正确,并给出跳转的首页或者再次回到登录页面,其中涉及了密码散列值加密的验证.接下里这里简单补充一下,用户登出的代码.主要谈一下用户注册,以及用户资料修改的内容.
  用户退出登录,必然在首页要有一个logout的链接,点击后可以删除当前的登录状态,重新设置用户会话,并且无登录跳转到首页.以它为例,说说这种链接怎么实现的.首先在首页html文件中写入跳转链接,这里链接到auth.logout函数,蓝本中必须加的上层文件夹名作为前缀.具体函数在app/auth/views.py中.

from flask.ext.login import logout_user, login_required

@auth.route('/logout')  #定义路由
@login_required  #只有在登录的前提下才能用logout这个路由函数
def logout():
  logout_user() #flask-login中的logout_user()函数,可以删除并重设用户会话
  flash('You have been logged out.')#显示一行信息
  return redirect(url_for('main.index'))#重定向到主页或者叫首页

之前都是假定用户数据已经在数据库了,现在添加新用户,那就要注册表单,渲染,数据库查询判断用户名是否可用,存储新用户的相关数据,邮件验证等代码.validators是扩展中的一个验证函数,它常用的参数有 Required, Length, Email, Regexp, EqualTo,分别是要求不能为空,长度限制,邮箱格式限制,正则表达,相等.但这个函数在提交表单时才生效验证,也会带来不必要的麻烦.比如说你所有的注册信息都写过了,提交时告诉你用户名已被注册,然后

from flask.ext.wtf import Form
from wtforms import StringField, PasswordField, BooleanField, SubmitField
from wtforms.validators import Required, Length, Email, Regexp, EqualTo
from wtforms import ValidationError
from ..models import User

class RegistrationForm(Form):#定义表单类
  email = StringField('Email', validators=[Required(), Length(1, 64),Email()])#验证是否为邮箱格式
  username = StringField('Username', validators=[
  Required(), Length(1, 64), Regexp('^[A-Za-z][A-Za-z0-9_.]*$', 0,'Usernames must have only letters, '
'numbers, dots or underscores')])
  password = PasswordField('Password', validators=[
  Required(), EqualTo('password2', message='Passwords must match.')])
  password2 = PasswordField('Confirm password', validators=[Required()])
  submit = SubmitField('Register')
  
def validate_email(self, field):
  if User.query.filter_by(email=field.data).first():
   raise ValidationError('Email already registered.')
def validate_username(self, field):
  if User.query.filter_by(username=field.data).first():
   raise ValidationError('Username already in use.')#如果输入的email和username,与数据库中的相同那么则抛出已被注册的错误.

表单好了,那么需要模板渲染表单了,这样在跳转到注册页面才能很好的显示.渲染模板依然用wtf.quick_form(),里面的参数就是要渲染的表单.
auth/register.html

{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}

{% block title %}Flasky - Register{% endblock %}
{% block page_content %}
<div class="page-header">
    <h1>Register</h1>
</div>
<div class="col-md-4">
    {{ wtf.quick_form(form) }}
</div>
{% endblock %}

按照习惯一般是在登陆界面进行跳转,再次把login.html的代码贴出来,加上一个跳转链接.

{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}

{% block title %}Flasky - Login{% endblock %}

{% block page_content %}
<div class="page-header">
    <h1>Login</h1>
</div>
<div class="col-md-4">
    {{ wtf.quick_form(form) }}
    <p>Forgot your password? <a href="{{ url_for('auth.password_reset_request') }}">Click here to reset it</a>.</p>
    <p>New user? <a href="{{ url_for('auth.register') }}">Click here to register</a>.</p>
</div>
{% endblock %}

可以看到最后一句url_for地址为注册页面,点击链接发出Get请求后,就会跳转到注册页面.上面还有一句是密码重置的链接,一起放在登陆界面允许用户点击跳转.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值