zl程序教程

您现在的位置是:首页 >  其他

当前栏目

9.用户登录_后端接口开发——WTForms表单验证、Tornado创建控制器发送请求

接口后端开发 创建 用户 登录 请求 验证
2023-09-27 14:23:04 时间

1.概述

在这里插入图片描述
上一次, 我们通过了邮箱验证的方式成功注册了用户,这里,我们将对比存储到mysql中的数据进行对比,成功则返回正确的结果

2.实现流程

  1. 首先,我们应该验证他的账号密码是否符合表单验证规则,这样可以避免用户输入错误一直发送请求浪费资源。所以,我们这里使用WTForms去验证
  2. 验证完之后,我们使用异步的peewee_async去处理数据,对其做验证功能

3.代码展示

3.1WTForms表单验证规则

# forum/wtforms.py
# 完整注册(给t_user表)增加数据之前的数据验证
from wtforms_tornado import Form
from wtforms.fields import StringField
from wtforms.fields.simple import HiddenField
from wtforms.validators import DataRequired, Length

# 对登录的数据验证
class LoginUserForm(Form):
    id = HiddenField()
    email = StringField('账号', validators=[DataRequired(message='请填写合法的邮箱地址'),Length(min=5, max=20, message='请输入5-20长度的邮箱')])
    nick_name = StringField('昵称')
    password = StringField('密码', validators=[Length(min=2, message='请输入2以上长度的密码')])
    signature = StringField('签名')
    pic = StringField('头像')

3.2登录接口

# forum/handler/UserHandler.py
from forum.wtforms import UserForm,LoginUserForm
from forum import manager
from forum.models import UserModel
from uuid import uuid4
from forum.handler.BaseHandler import BaseHandler
from forum.utils.email_utils import send_mail
from forum.utils.redis_utils import *
from random import randint
from config import email
# 登录接口
class LoginHandler(BaseHandler):
    async def post(self):
        # 记录登录信息
        rs_data = {}
        # 获取表单数据
        user_form = LoginUserForm(self.request.arguments)
        # 验证是否符合form表单输入的规则
        if user_form.validate():
            try:
                # 数据库中获取
                user = await manager.get(UserForm, email=user_form.email.data, password=user_form.password.data)
                # 获取到了,登录成功
                rs_data['code'] =200
                rs_data['msg'] = '登录成功!!!'
            except Exception as e:
                # 获取不到,登录失败
                rs_data['code'] = 401
                rs_data['msg'] = '用户名或密码错误'
        else:
            rs_data['code'] = 401
            rs_data['msg'] = '用户名不符合规范'
            for f in user_form.errors:
                print(user_form.errors)
                rs_data[f] = user_form.errors[f][0]
        self.finish(rs_data)

4.Postman测试

注意!!!前端做了加密和解密处理,所以,postman测试时候是对应mysql中存储的密码数据;前端登录时,输入加密之前的数据即可
在这里插入图片描述
在这里插入图片描述