广告
返回顶部
首页 > 资讯 > 数据库 >Flask + MySQL如何实现用户注册,登录和登出的项目实践
  • 887
分享到

Flask + MySQL如何实现用户注册,登录和登出的项目实践

2024-04-02 19:04:59 887人浏览 八月长安
摘要

目录一、实战场景二、主要知识点三、菜鸟实战四、运行结果一、实战场景 flask 框架实现用户的注册,登录和登出。 二、主要知识点 flask_login 插件使用sqlAlchemy

一、实战场景

flask 框架实现用户的注册,登录和登出。

二、主要知识点

  • flask_login 插件使用
  • sqlAlchemy 基础操作
  • 用户基础类设计
  • Flask 读取配置文件
  • 蓝图注册与使用
  • wtfORMs 表单提交数据
  • wtforms 表单验证
  • Bootstrap 集成
  • Jinjia2 模版继承

 涉及的知识点和细节很多,我下面就直接贴出注册部分的核心代码

三、菜鸟实战

马上安排!

1、应用初始化 Mysql 和 flask_login 模块

'''
Author: 菜鸟实战
Description: 创建应用程序,并注册相关蓝图
'''
 
from flask import Flask
from base.base_model import db
from flask_login import LoginManager
 
# 登录插件
login_manager = LoginManager()
 
def reGISter_auth_blueprint(app):
    # 注册蓝图
    from app.auth import auth_bp
    app.register_blueprint(auth_bp)
 
def create_app(config=None):
    # 创建应用
    app = Flask(__name__)
 
    # 加载配置
    app.config.from_object('config')
 
    # 注册 SQLAlchemy
    db.init_app(app)
    #
    # 注册 login 模块
    login_manager.init_app(app)
 
    # 未登录时候的默认跳转页面
    login_manager.login_view = 'auth.login'
    # # login_manager.login_message = '请先登录或注册'
 
    register_auth_blueprint(app)
 
    if config is not None:
        if isinstance(config, dict):
            app.config.update(config)
        elif config.endswith('.py'):
            app.config.from_pyfile(config)
 
    return app
 
app = create_app()
 
with app.app_context():
    db.create_all()
 
if __name__ == '__main__':
    # 如果要使用 vscode 调试,需要将 debug 设置为 False,否则无法命中请求断点
    app.run(host='0.0.0.0', debug=True)

2、设置配置文件

 
APP_NAME = "north"
 
SECRET_KEY = "fNqh2TNw3l0Dj8ZCMQyQh7m1YvWVSgDx"
 
DEBUG = True
 
SQLALCHEMY_DATABASE_URI = 'mysql://username:passWord@ip:3306/dbname'
 
# 设置sqlalchemy自动更跟踪数据库
SQLALCHEMY_TRACK_MODIFICATIONS = True
 
# 查询时会显示原始SQL语句
SQLALCHEMY_ECHO = True

3、蓝图初始化

'''
Author: 菜鸟实战
'''
 
from flask import Blueprint
 
auth_bp = Blueprint(
    'auth',
    __name__,
)
 
from app.auth.user import user, auth
 

4、编写注册表单

 <main class="form-signin w-100 m-auto">
 <form action="{{ url_for('auth.register') }}" method="post">
    <img class="mb-4" src="{{ url_for('static', filename="3rd/images/bootstrap-loGo.svg") }} " alt="" width="72" height="57">
    <h1 class="h3 mb-3 fw-normal">注册信息</h1>
 
    <div class="form-floating">
      <input class="form-control"
             id="nickname" name="nickname"
              value="{{ form.data['nickname'] | default('',true) }}"
              placeholder="昵称">
      <label for="floatingInput">昵称</label>
    </div>
    <div class="form-floating">
      <input type="email" class="form-control"
             id="email" name="email"
              value="{{ form.data['email'] | default('',true) }}"
              placeholder="Email">
      <label for="floatingInput">邮箱</label>
    </div>
    <div class="form-floating">
      <input type="password" class="form-control"
              id="password" name="password"
              value="{{ form.data['password'] | default('',true) }}"
              placeholder="Password">
      <label for="floatingPassword">密码</label>
    </div>
    <div class="form-floating">
      <input type="password" class="form-control"
              id="confirm_password" name="confirm_password"
              value="{{ form.data['confirm_password'] | default('',true) }}"
              placeholder="Confirm Password">
      <label for="floatingPassword">确认密码</label>
    </div>
        {% if form and form.errors %}
            {% for key, error in form.errors.items() %}
                <div class="alert alert-warning" role="alert">{{ key }} : {{ error }}</div>
            {% endfor %}
        {% endif %}
 
    <button class="w-100 btn btn-lg btn-primary" type="submit">注册</button>
    <p class="mt-5 mb-3 text-muted">菜鸟实战 &copy; 2017–2022</p>
  </form>
</main>
 

5、提交注册表单

@auth_bp.route("/register", methods=['POST', 'GET'])
def register():
    # 注册逻辑
    form = RegisterForm(request.form)
 
    # 检查
    if request.method == 'POST' and form.validate():
        # 执行正确逻辑
        user = User()
        user.set_attrs(form.data)
 
        user.name = user.nickname
        user.token = user.generate_token()
 
        db.session.add(user)
        db.session.commit()
 
        # 执行登录
        login_user(user, False)
 
        return redirect(url_for('auth.home'))
 
    return render_template("auth/register.html", form=form)

6、用户模型

'''
Author: 菜鸟实战
'''
import random
 
from sqlalchemy import Column, ForeignKey, func
from sqlalchemy import String, Unicode, DateTime, Boolean
from sqlalchemy import TIMESTAMP, Integer, Float
from flask_login import login_user, login_required, logout_user, current_user, UserMixin
from werkzeug.security import generate_password_hash, check_password_hash
 
 
from common.helpers.str_helper import random_string
from north import login_manager
 
from  base.base_model import BaseModel
 
class User(BaseModel, UserMixin):
    # UserMixin 继承属性
    __tablename__ = 'users'
 
    # 表基础值
    phone_number = Column(String(16), unique=True)
    email = Column(String(64), unique=True, nullable=False)
    token = Column(String(64))
    password = Column('password', String(100))
    status = Column(Integer, default=1)
    type = Column(Integer, default=1)
 
    # 定义一个对象属性,对应表中的 password 字段
    _password = Column('password', String(100))
 
    @property
    def password(self):
        # 定义属性,使用对象属性赋值
        return self._password
 
    @password.setter
    def password(self, raw):
        # 属性赋值
        self._password = generate_password_hash(raw)
 
    def check_password(self, raw):
        # 检查密码
        if not self._password:
            return False
        return check_password_hash(self._password, raw)
 
    def generate_token(self, expiration=60000):
        # 生成 token
        return random_string(32)
 
 
@login_manager.user_loader
def get_user(uid):
    # 必须, login 插件制定方法
    return User.query.get(int(uid))

7、模型基类

'''
Author: 菜鸟实战
'''
 
import pymysql
import datetime
 
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import Column, Integer, SmallInteger
from sqlalchemy import String, Unicode, DateTime, Boolean
 
# 初始化数据库类型
pymysql.install_as_MySQLdb()
db = SQLAlchemy()
 
# 模型基础类
class BaseModel(db.Model):
    __abstract__ = True
 
    id = Column(Integer, primary_key=True)
    name = Column(String(32), nullable=False)
    nickname = Column(String(32), nullable=False)
    is_enable = Column(SmallInteger, default=1, nullable=False)
    created_at = db.Column(db.DateTime, default=datetime.datetime.now)
    updated_at = db.Column(db.DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now)
    deleted_at = db.Column(db.DateTime)
 
    def __init__(self):
        pass
 
    # 字典赋值, 场景: 表单提交
    def set_attrs(self, attrs):
        for key, value in attrs.items():
            if hasattr(self, key) and key != 'id':
                setattr(self, key, value)
 

8、表单验证

'''
Author: 菜鸟实战
Description: 注册表单
'''
from wtforms import StringField, PasswordField, Form, validators
# from wtforms.validators import Length, Email, \
#     ValidationError, EqualTo
from app.auth.user.user_model import User
 
class RegisterForm(Form):
    nickname = StringField('昵称',
        validators = [
            validators.DataRequired(),
            validators.Length(2, 32)
            #   validators.Email(message='电子邮箱不符合规范')
        ])
    email = StringField('电子邮件',
        validators = [
            validators.DataRequired(),
            validators.Length(10, 50)
 
            #   validators.Email(message='电子邮箱不符合规范')
        ])
    password = PasswordField('密码', [
        validators.DataRequired(),
        validators.EqualTo('confirm_password', message='密码需要一致')
    ])
    confirm_password = PasswordField('Repeat Password', [
        validators.DataRequired(),
 
    ])
 
    def validate_email(self, field):
        # 自定义验证,命名对应
        if User.query.filter_by(email=field.data).first():
            raise validators.ValidationError('邮件已被注册')
 
    def validate_nickname(self, field):
        if User.query.filter_by(nickname=field.data).first():
            raise validators.ValidationError('昵称已存在')

9、代码主要目录结构

├── app
│   ├── __init__.py
│   ├── auth
│   │   ├── __init__.py
│   │   └── user
│   └── tools
│       ├── __init__.py
│       └── db_tools.py
├── base
│   ├── __init__.py
│   ├── base_blueprint.py
│   ├── base_form.py
│   └── base_model.py
├── common
│   ├── __init__.py
│   └── helpers
│       ├── __init__.py
│       └── str_helper.py
├── config.py 

├── north.py 

四、运行结果

1、注册和验证

2、注册成功登录 

3、登录 

 到此这篇关于Flask + MySQL如何实现用户注册,登录和登出的项目实践的文章就介绍到这了,更多相关Flask  MySQL 用户注册登录登出内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: Flask + MySQL如何实现用户注册,登录和登出的项目实践

本文链接: https://www.lsjlt.com/news/118631.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Flask + MySQL如何实现用户注册,登录和登出的项目实践
    目录一、实战场景二、主要知识点三、菜鸟实战四、运行结果一、实战场景 Flask 框架实现用户的注册,登录和登出。 二、主要知识点 flask_login 插件使用SQLAlchemy...
    99+
    2022-11-11
  • Flask登录注册项目的简单实现
    本文主要介绍了Flask登录注册项目的简单实现,分享给大家,具体如下: 目录结构 配置文件设计 /templates/config.py #数据库连接配置 import p...
    99+
    2022-11-12
  • 使用Flask怎么实现一个登录注册项目
    使用Flask怎么实现一个登录注册项目?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。目录结构配置文件设计/templates/config.py#数据库连接配置...
    99+
    2023-06-15
  • 如何在PHP项目中实现用户登录和注册功能?
    如何在PHP项目中实现用户登录和注册功能?在许多Web应用程序中,用户登录和注册功能是必不可少的。无论是电子商务网站、社交媒体还是论坛,用户登录和注册功能是为了确保用户身份安全,并为用户提供个性化的服务。本文将介绍如何在PHP项目中实现用户...
    99+
    2023-11-02
    PHP用户认证 PHP登录功能 PHP注册功能
  • QT如何实现用户登录注册
    本篇内容主要讲解“QT如何实现用户登录注册”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“QT如何实现用户登录注册”吧!具体代码如下#include "widget.h&quo...
    99+
    2023-07-02
  • Node.js+Express+MySql如何实现用户登录注册功能
    这篇文章主要介绍了Node.js+Express+MySql如何实现用户登录注册功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体内容如...
    99+
    2022-10-19
  • JS+PHP如何实现用户注册及登录
    小编给大家分享一下JS+PHP如何实现用户注册及登录,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!<!DOCTYPE ht...
    99+
    2022-10-19
  • QT如何实现用户登录注册功能
    这篇文章主要介绍“QT如何实现用户登录注册功能”,在日常操作中,相信很多人在QT如何实现用户登录注册功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”QT如何实现用户登录注册功能”的疑惑有所帮助!接下来,请跟...
    99+
    2023-07-02
  • php如何实现用户注册登录界面
    今天小编给大家分享一下php如何实现用户注册登录界面的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。php实现用户注册登录界面...
    99+
    2023-07-04
  • MySQL 实现点餐系统的用户登录注册功能
    MySQL 实现点餐系统的用户登录注册功能在开发点餐系统时,用户登录注册功能是必不可少的一部分。本文将介绍如何使用MySQL数据库实现点餐系统的用户登录注册功能,并给出具体的代码示例。创建用户表首先,我们需要在MySQL数据库中创建一个用户...
    99+
    2023-11-01
    MySQL 用户登录注册 点餐系统
  • 如何使用node和express连接mysql实现登录注册
    这篇文章将为大家详细讲解有关如何使用node和express连接mysql实现登录注册,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。数据库我选了比较“正式”的MySQL,...
    99+
    2022-10-19
  • node.js+jQuery如何实现用户登录注册AJAX交互
    这篇文章给大家分享的是有关node.js+jQuery如何实现用户登录注册AJAX交互的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.login.ejs实现form框架&nbs...
    99+
    2022-10-19
  • 用node和express连接mysql实现登录注册的实现代码
    为了数据库课设,打算后台用node搭建,前台用vue搞个博客出来(因为前段时间在学啊)。本来node不想用框架,喜欢先打好基础的,奈何3个星期要把他做完和应付各种考试,所以最后还是用了express,大大简...
    99+
    2022-06-04
    代码 node express
  • 基于SpringBoot和Vue3的博客平台的用户注册与登录功能实现
    目录1. 后端Spring Boot实现1.1 创建Spring Boot项目1.2 配置application.yml1.3 实现后端API1.3.1 创建User实体类1.3.2...
    99+
    2023-05-15
    基于SpringBoot和Vue3的用户注册与登录功能实现 基于Spring Boot和Vue3的用户注册 基于Spring Boot和Vue3的用户登录
  • Android Studio如何实现QQ的注册登录和好友列表跳转
    这篇文章主要介绍Android Studio如何实现QQ的注册登录和好友列表跳转,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、项目概述本次项目主要包含了注册、登录和好友列表三个界面以及之间相互跳转。其中好友列表界...
    99+
    2023-06-15
  • 基于SpringBoot和Vue3的博客平台的用户注册与登录功能怎么实现
    今天小编给大家分享一下基于SpringBoot和Vue3的博客平台的用户注册与登录功能怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一...
    99+
    2023-07-06
  • 微信小程序登录态和检验注册过没的app.js如何实现
    小编给大家分享一下微信小程序登录态和检验注册过没的app.js如何实现,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!0、可参考的...
    99+
    2022-10-19
  • 安卓studio 个人课设项目:“这个app“——实现注册登录,显示用户信息功能,并跳转对应网页
    目录 目录 功能说明  登录页面 注册页面 登录后界面 点击头像出现侧滑界面,并显示用户信息 点击编辑按钮进入信息编辑页面  保存后返回  用户名已更改 跳转网页 相关代码 布局 登录界面  注册界面  信息显示界面  主界面 实现侧滑布局...
    99+
    2023-09-15
    android java webview
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作