ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Seven——tornado操作之用户注册功能的实现(用户注册的表单信息进行简单的验证并存储到数据库中指定的表中);用户登录功能的修补完善

2021-07-08 12:07:24  阅读:224  来源: 互联网

标签:username Seven 用户注册 数据库 User 表中 password self


1.用户注册功能的实现

1.码注册接口(tudo_first/app.py):

在这里插入图片描述

2.码注册视图(在handlers/auth.py中进行如下操作):

添加用户注册视图:

class SignupHandler(AuthBaseHandler):  # 因为用户注册功能是跟用户相关的,所以继承带有认证功能的AuthBaseHandler
    """
    注册视图
    """
    def get(self, *args, **kwargs):
        self.render('signup.html')

3.码注册页面(templates/signup.html):

{% extends 'base.html' %}
{% block title %}signup page{% end%}
{% block content %}
I am signup<br>

{% if msg %}
<p>{{ msg }}</p>
{% end %}

<!--   action表示向何处发送表单数据,此处是发送给/signup对应的视图类的post方法里;enctype是指网络之间传递数据的类型,使用默认值,默认任何数据类型都可;-->
<form action="/signup" enctype="multipart/form-data" method="post">
    <div>
        Username
        <input name="username" type="text" required="">
    </div>
    <div>
        Password
        <input name="password1" type="password" required="">
    </div>
        <div>
        Password confirmation
        <input name="password2" type="password" required="">
    </div>

    <button>注册</button>
    <div>
        已经有此账号,请<a href="/login">登录</a>
    </div>
</form>
{% end %}

4.用户注册信息表单提交后的处理逻辑:

第一步——整体逻辑(handlers/auth.py文件中对注册视图SignupHandler类添加如下post方法!)
[注意:要导入下面所编写的register方法!
from utils.account import register
]

    def post(self, *args, **kwargs):
        # 1.获取数据
        username = self.get_argument('username',None)
        password1 = self.get_argument('password1',None)
        password2 = self.get_argument('password2',None)
        # 2.校验数据————三层逻辑:第一层:用户要输入用户名,密码及确认密码;第二层:用户输入的密码和确认密码要相同;
        #                      第三层:msg的值为ok(msg是register()函数的返回值,register()函数是判断数据库中是否存在该用户,如果不存在返回msg!)。
        if username and password1 and password2:
            if password1 == password2:
                msg = register(username, password1)
                if msg == 'ok':
                    # 保持登录状态的同时跳转到其他的页面
                    self.session.set('tudo_user',username)
                    self.redirect('/')
                else:
                    self.render('signup.html',msg=msg)
            else:
                self.render('signup.html',msg='两次密码不一致!')
        else:
            self.render('signup.html', msg='register fail!')

第二步——编写register方法(utils/account.py文件中添加register方法:判断用户注册的用户名是否在数据库的users表中存在!)
[注意:要导入包含下面所编写的is_exists()方法和add()方法的类!
from modles.account import User
]

def register(username, password):
    """
    用户注册表单信息的校验逻辑——判断此用户名是否存在于数据库中,即此用户名是否注册过!
    :param username:
    :param password:
    :return:
    """
    if User.is_exists(username):
        return 'username is exists'
    else:
    	# 将此用户提交的注册表单信息插入数据库中!
        # 注意:数据库存用户密码存的是加密过后的密码哦!
        User.add(username, hashed(password))
        return 'ok'

第三步——编写add()方法和is_exists()方法(modles/account.py文件中User类中添加add()方法——用于向数据库对应表中添加用户注册的用户表单信息;is_exists()方法——查询数据库中是否有这个用户名!)

[注意:首先要导入并使用DBSession()——作用是保持指定的数据库的连接!
from .db import DBSession

session = DBSession()
]

    # 用户注册时——向数据库对应表中添加用户注册的用户表单信息
    @classmethod
    def add(self, username, password):
        # 1.将用户表单信息与MYSQL中User表字段对应
        user = User(name=username, password=password)
        # 2.数据库中插入此user数据
        session.add(user)
        # 3.提交
        session.commit()


    # 用户注册时——查询数据库中是否有这个用户名
    @classmethod
    def is_exists(cls, username):
        # tornado操作数据库命令十分接近数据库命令!
        # session相当于MYSQL数据库对象;.query()是查询方法,其内加查询条件;
        # exists()是sqlalchemy库中判断连接的数据库中是否存在某数据的方法;
        # .where(User.name==username)是tornado中对数据库的查询命令——表User中的字段name的值与传递此方法的参数username相同的那条数据;
        # .scalar()方法是提取符合此要求的数据——获取值进行显示。
        return session.query(exists().where(User.name==username)).scalar()

完美实现:

前端注册页面:
在这里插入图片描述
正确输入注册信息(且此用户数据库中不存在!):
在这里插入图片描述
点击注册按钮后,注册成功——保持登录状态的同时跳转到了指定的主页!

在这里插入图片描述
观察数据库中,会发现用户注册的信息已经插入OK!
在这里插入图片描述

2.用户登录功能的修补完善

还记得之前码用户登录功能模块时用的是直接在项目一个文件中写的模拟数据库中存储的一组用户名和密码的假数据嘛!
但是现在咱们用户注册的表单信息都可以成功存储到服务器的数据库中了,就可以真枪实弹了!

1.删除假数据(utils/account.py中删除如下!):在这里插入图片描述

2.更改用户登录验证逻辑函数authenticate():

def authenticate(username,password):
    """
    用户登录验证逻辑
    :param username:
    :param password:
    :return:
    """
    if username and password:
    	# 判断数据库中此用户名对应的密码是否和用户登录时输入的密码一致(都是加密后的!)
    	# 因为涉及到对数据库的操作,所以用到User类,在此类中在封装一个get_password()方法用于从数据库中获取该用户名对应的密码。
        return User.get_password(username) == hashed(password)
        # 使用假数据时:return (username == USER_DATA['name']) and (hashed(password)==USER_DATA['password'])
    else:
        return False

modles/account.py文件中在User类中封装get_password()方法如下:

    # 用户登录时——判断此用户名是否存在于数据库。如果存在则返回此用户名对应的密码。
    @classmethod
    def get_password(cls, username):
        # query(cls)参数为cls即为类本身User,即查询条件为根据此类所迁移的整张表users;
        # filter_by(name=username)过滤条件为表中name字段=username的数据;
        # first()取出符合条件的第一条数据;
        user = session.query(cls).filter_by(name=username).first()
        if user:
            return user.password
        else:
            return ''

完美实现:

在这里插入图片描述
输入一个注册进数据库的用户信息,然后点击Login:

在这里插入图片描述完美登录成功并跳转到首页!

3.用户退出功能的实现

1.码退出接口:(app.py中加入如下接口!)

在这里插入图片描述

2.码退出视图:(handlers/auth.py中加入如下退出登录视图类)

class LogoutHandler(AuthBaseHandler):
    """
    退出视图
    """
    def get(self, *args, **kwargs):
        # 删除当前用户的session,即实现了退出!
        self.session.delete('tudo_user')
        print('退出成功!')
        self.write('logout done')

测试——完美运行:

登录之后显示主页:
在这里插入图片描述

直接请求退出接口http://118.31.61.177:8000/logout

在这里插入图片描述
退出成功!

 

标签:username,Seven,用户注册,数据库,User,表中,password,self
来源: https://blog.51cto.com/u_15264787/3011701

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有