首页 > 其他分享 >为登录页,添加登录逻辑代码,实现登录

为登录页,添加登录逻辑代码,实现登录

时间:2024-02-02 15:01:53浏览次数:27  
标签:return 登录 代码 db email 添加 import self

使用 PyQt5(PySide2)+SQLAlchemy 做一个登录注册页(四)

本文将介绍自己用 PyQt5+SQLAlchemy 做的一个登录注册页,使用邮箱接收验证码本文介绍是前后端未分离的实现方式,后续将出一个前后端分离的,你可以将 PyQt5 改为 PySide2 以获得更宽松的开源协议

本文由于涉及到的代码较多,将会是一个系列,会有多篇文章

系列文章索引

  1. 设计登录注册页面
  2. 添加代码运行登录注册页,并为其添加一些样式,和调用资源文件
  3. 使用 SQLAlchemy 实现用户数据库管理
  4. 为登录页,添加登录逻辑代码,实现登录

必要说明

  • 使用的环境 requirements.txt
# Python3.8.10 x32
# Windows10 x64
PyQt5
pyqt5-tools
PyMySQL~=1.1.0
sqlalchemy~=2.0.25
bcrypt~=4.1.2
email-validator # new add
  • 项目结构(显示变化的部分)
--- QtLoginRegistration
  |--- lib
     |--- __init__.py
     |--- basic_function.py       # 存放公共方法
  |--- crud
     |--- __init__.py
     |--- crud.py                 # 数据库操作
  |--- requirements.txt           # 添加 email-validator

为登录页,添加登录逻辑代码,实现登录

第1步

添加必填校验

  1. 新建 lib/basic_function.py 文件,保存基础公共方法,增加以下内容
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@ Project     : QtLoginRegistration 
@ File        : basic_function.py
@ Author      : yqbao
@ Version     : V1.0.0
@ Description : 基础公共方法类
"""

from PyQt5.QtCore import QObject
from PyQt5.QtGui import QIcon, QPixmap
from PyQt5.QtWidgets import QMessageBox


class BasicFunction(QObject):
    """一个基础公共方法类"""

    def __init__(self, parent=None):
        super().__init__(parent=parent)

    @staticmethod
    def info_message(msg):
        """公共的消息提示"""
        message = QMessageBox(QMessageBox.Information, "提示", msg, QMessageBox.Yes)
        icon = QIcon()
        icon.addPixmap(QPixmap(":/home/images/testing_x48.ico"), QIcon.Normal, QIcon.Off)
        message.setWindowIcon(icon)
        message.button(QMessageBox.Yes).setText('确定')
        message.exec()  # 模态显示

  1. core/login_register.py 中添加如下代码 GitHub完整代码
# 导入
from lib.basic_function import BasicFunction

# 在 构造方法 __init__ 中实例公共方法类
self.basic_function = BasicFunction(self)

# 在 init_ui 方法中 添加登录页需要绑定的信号
self.pushButtonLogin.clicked.connect(self.login)

# 在类中添加 2个新方法
def login(self):
    """登录动作"""
    if not self.required_login():  # 必填校验未通过
        return

def required_login(self):
    """登录必填校验"""
    self.account = self.lineEditUsername.text()
    self.password = self.lineEditPassword.text()
    if not self.account.strip():
        self.basic_function.info_message("用户账号不能为空")
        return
    if not self.password.strip():
        self.basic_function.info_message("用户密码不能为空")
        return
    return True
  1. 运行效果

image


第2步

完善登录校验逻辑

  1. 新建 crud/crud.py 文件,增加以下内容
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@ Project     : QtLoginRegistration 
@ File        : crud.py
@ Author      : yqbao
@ Version     : V1.0.0
@ Description : 
"""
from typing import Union

from sqlalchemy import and_
from sqlalchemy.orm import Session

from db import models


class CRUD(object):
    @staticmethod
    def _commit(db: Session, db_obj):
        try:
            db.commit()
            return db_obj
        except Exception:
            db.rollback()
            return


class CRUDUser(CRUD):

    @staticmethod
    def get_user_by_email(db: Session, email: str) -> Union[models.User, None]:
        """根据email查询用户"""
        return db.query(models.User).filter(and_(models.User.email == email, models.User.deleted == '0')).first()

    @staticmethod
    def get_user_by_username(db: Session, username: str) -> Union[models.User, None]:
        """根据username查询用户"""
        return db.query(models.User).filter(and_(models.User.username == username, models.User.deleted == '0')).first()

  1. core/login_register.py 中添加如下代码 GitHub完整代码
# 导入
import bcrypt
from email_validator import validate_email, EmailNotValidError
from crud.crud import CRUDUser
from db import SessionLocal

# 在 构造方法 __init__ 中实例公共方法类
self.user = CRUDUser()

# 修改 login 方法
def login(self):
    """登录动作"""
    if not self.required_login():  # 必填校验未通过
        return
    try:
        info = validate_email(self.account, check_deliverability=False)
        email = info.normalized
        with SessionLocal() as db:
            user = self.user.get_user_by_email(db, email)
    except EmailNotValidError:  # 输入的是否是邮箱,不是将报错
        with SessionLocal() as db:
            user = self.user.get_user_by_username(db, self.account)

    if not user:  # 查询空,无此用户
        self.basic_function.info_message("用户名或密码错误")
        return
    if user.disabled == '0':
        self.basic_function.info_message("此用户账号已被禁用")
        return
    bytes_my_password = bytes(self.password, encoding="utf-8")
    str_my_hash_password = user.password
    bytes_my_hash_password = bytes(str_my_hash_password, encoding='utf-8')
    check = bcrypt.checkpw(bytes_my_password, bytes_my_hash_password)
    if not check:  # 校验通过,设置QDialog对象状态为允许
        self.basic_function.info_message("用户名或密码错误")
        return
    self.accept()
  1. 运行效果

image
image

GitHub完整代码
本文章的原文地址
GitHub主页

标签:return,登录,代码,db,email,添加,import,self
From: https://www.cnblogs.com/yqbaowo/p/18002723

相关文章

  • KEIL-c51添加STC库的万能办法
    目前的keil数据库里面没有STC的数据库,每次都要替换,现在教大家一种方法,我试过的最有效的方法,在不改变原有库的情况下添加STC的数据库。1.把下载的文件解压,复制到keil安装文件下的UV4里,例如E:\Keil\UV42.更改keil安装目录下的TOOLS.INI文件,在[uv2]下一行(如果是keil4,就是第二行)添......
  • 【查询类博客】金牌导航代码
    3-x-x3-1-x3-1-1#include<bits/stdc++.h>usingnamespacestd;constintN=505;intmatch[N];intg[N][N];boolvis[N];intn,k;intans;boolNtr(intu){for(inti=1;i<=n;i++){if(g[u][i]&&!vis[i]){......
  • 使用无代码/低代码平台进行开发的 5 大挑战
    近年来,越来越多的开发者会选择使用无代码/低代码平台进行业务系统的开发。原因很简单:不用从零开始研发一整套系统,并且有易用的模板和可视化的操作界面,大大减少了业务开发的难度和所需时间。然而,真正尝试过的开发者会发现,无代码/低代码确实能让开发变“简单”,但新的挑战也随之而来......
  • h5st 4.3版本代码研究
    背景介绍最近比较悠闲,于是没事研究了一下某东的h5st代码,2024年新鲜出炉的前端加密代码;最大的惊喜并不是算法的复杂,在逆向破解代码的过程中,对js加密混淆有了新的认识;于是心血来潮,回到这里,写一份研究总结,供技术交流分享。 代码分析拿到的代码是h5st的4.3版本使用开发者工具......
  • R语言时变向量自回归(TV-VAR)模型分析时间序列和可视化|附代码数据
    全文链接:http://tecdat.cn/?p=22350 最近我们被客户要求撰写关于时变向量自回归(TV-VAR)模型的研究报告,包括一些图形和统计输出。在心理学研究中,个人主体的模型正变得越来越流行。原因之一是很难从人之间的数据推断出个人过程另一个原因是,由于移动设备无处不在,从个人获得的时间......
  • Python中用PyTorch机器学习神经网络分类预测银行客户流失模型|附代码数据
    阅读全文:http://tecdat.cn/?p=8522最近我们被客户要求撰写关于神经网络的研究报告,包括一些图形和统计输出。分类问题属于机器学习问题的类别,其中给定一组特征,任务是预测离散值。分类问题的一些常见示例是,预测肿瘤是否为癌症,或者学生是否可能通过考试在本文中,鉴于银行客户的某些......
  • NLP自然语言处理—主题模型LDA案例:挖掘人民网留言板文本数据|附代码数据
    全文链接:http://tecdat.cn/?p=2155最近我们被客户要求撰写关于NLP自然语言处理的研究报告,包括一些图形和统计输出。随着网民规模的不断扩大,互联网不仅是传统媒体和生活方式的补充,也是民意凸显的地带。领导干部参与网络问政的制度化正在成为一种发展趋势,这种趋势与互联网发展的时......
  • Trino-登录WebUI页面报错,日志中提示:
    问题描述启动Trino客户端执行showcatalogs时报错:Errorstartingqueryathttp://localhost:8080/v1/statementreturnedaninvalidresponse。 此时在浏览器中访问TrinoWebUI,http://192.168.80.133:8080,页面报错:404 NotFound. 问题原因(1)查询Trino日志发现:BindEx......
  • 微信公众号链接小程序HTML代码
     <!--格式--><adata-miniprogram-appid="小程序APPID"data-miniprogram-path="小程序页面"data-miniprogram-nickname="小程序名称"data-miniprogram-type="image"data-miniprogram-servicetype=""><imgcla......
  • 添加启动应用
    现在以微信为例1、首先找到微信的位置 2、新建一个文本文档,输入:@echooffstart"""F:\WeiXin\WeChat\WeChat.exe"start"""F:\WeiXin\WeChat\WeChat.exe"start"""F:\WeiXin\WeChat\WeChat.exe"exit并保存。......