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

目录
  • 一、实战场景
  • 二、主要知识点
  • 三、菜鸟实战
  • 四、运行结果

一、实战场景

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 用户注册登录登出内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • flask框架配置mysql数据库操作详解

    本文实例讲述了flask框架配置mysql数据库操作.分享给大家供大家参考,具体如下: 该篇博客配置环境为:python版本3.5,flask2.0,python3中已经不再支持MySQLdb模块,所有这里我用了pymysql,所有使用前应该 安装pymysql: pip install pymysql 在网上的好多资料都给的是使用sqlite的例子,由于很不喜欢所以今天分享一下flask-sqlalchemy操作mysql的方法. 以前习惯使用sqlalchemy,后来发现使用flask-sq

  • python使用Flask操作mysql实现登录功能

    用到的一些知识点:Flask-SQLAlchemy.Flask-Login.Flask-WTF.PyMySQL 这里通过一个完整的登录实例来介绍,程序已经成功运行,在未登录时拦截了success.html页面跳转到登录页面,登录成功后才能访问success. 以下是项目的整体结构图: 首先是配置信息,配置了数据库连接等基本的信息,config.py DEBUG = True SQLALCHEMY_ECHO = False SQLALCHEMY_DATABASE_URI = 'mysql+pymy

  • flask + pymysql操作Mysql数据库的实例

    安装flask-sqlalchemy.pymysql模块 pip install flask-sqlalchemy pymysql ### Flask-SQLAlchemy的介绍 1. ORM:Object Relationship Mapping(模型关系映射). 2. flask-sqlalchemy是一套ORM框架. 3. ORM的好处:可以让我们操作数据库跟操作对象是一样的,非常方便.因为一个表就抽象成一个类,一条数据就抽象成该类的一个对象. 4. 安装`flask-sqlalchemy

  • flask 框架操作MySQL数据库简单示例

    本文实例讲述了flask 框架操作MySQL数据库.分享给大家供大家参考,具体如下: 一.创建数据库表格 """ Created on 19-10-8 @requirement:Anaconda 4.3.0 (64-bit) Python3.6 @description:创建表格 """ import pymysql server = '127.0.0.1' user = 'root' password = 'password' # 连接数据库

  • 用Python的Flask框架结合MySQL写一个内存监控程序

    这里以监控内存使用率为例,写的一个简单demo性程序,具体操作根据51reboot提供的教程写如下. 一.建库建表 创建falcon数据库: mysql> create database falcon character set utf8; Query OK, 1 row affected (0.00 sec) 创建内存监控使用的表stat,表结构如下: CREATE TABLE `stat` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `h

  • Python web框架(django,flask)实现mysql数据库读写分离的示例

    读写分离,顾名思义,我们可以把读和写两个操作分开,减轻数据的访问压力,解决高并发的问题. 那么我们今天就Python两大框架来做这个读写分离的操作. 1.Django框架实现读写分离 Django做读写分离非常的简单,直接在settings.py中把从机加入到数据库的配置文件中就可以了. DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'HOST': '127.0.0.1', # 主服务器的运行ip 'PORT':

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

    目录 一.实战场景 二.主要知识点 三.菜鸟实战 四.运行结果 一.实战场景 Flask 框架实现用户的注册,登录和登出. 二.主要知识点 flask_login 插件使用 SQLAlchemy 基础操作 用户基础类设计 Flask 读取配置文件 蓝图注册与使用 wtforms 表单提交数据 wtforms 表单验证 Bootstrap 集成 Jinjia2 模版继承 涉及的知识点和细节很多,我下面就直接贴出注册部分的核心代码 三.菜鸟实战 马上安排! 1.应用初始化 MySQL 和 flask

  • python使用tornado实现登录和登出

    本文实例为大家分享了tornado实现登录和登出的具体代码,供大家参考,具体内容如下 main.py如下: import tornado.httpserver import tornado.ioloop import tornado.web import tornado.options import os.path from tornado.options import define, options define("port", default=8000, help="ru

  • SpringSecurity OAuth2单点登录和登出的实现

    目录 1. 单点登录 1.1 使用内存保存客户端和用户信息 1.2 使用数据库保存客户端和用户信息 1.3 单点登录流程 1.3 JWT Token 2. 单点登出 3. 总结 参考: Spring Security OAuth 最新官方已经不再维护,以下内容只用于学习记录. GitHub:shpunishment/spring-security-oauth2-demo 1. 单点登录 单点登录即有多个子系统,有一个认证中心.当访问其中任意一个子系统时,如果发现未登录,就跳到认证中心进行登录,登

  • Vue实现登录以及登出详解

    目录 登录业务流程 登录功能实现 总结 首先先了解一下,我们的效果实现流程 首先登录概述及业务流程和相关技术点 录页面的布局 创建两个Vue.js文件 一个我们来做登录页和注册页 登录页面的布局 配置路由 登录表单的数据绑定 登录表单的验证规则 登录表单的重置 登录预验证 登录组件配置弹窗提示 登录成功后的行为 将登录之后的token,保存到客户端的sessionStorage中 通过编程式导航跳转到后台主页,路由地址是默认路径 '/' 在我们首页的登出,组件配置弹窗提示,把我们的token使用

  • vue实现登陆登出的实现示例

    最近接手的B端项目选择了vue来做,此项目使用element ui Message等为组件 望周知 需求 登陆成功后跳转至首页 首页不能手动跳转至登陆页 登陆后跳转至目标页面 此次B端SPA项目把ak存在localstorage中 1.登陆的跳转利用全局钩子router.beforeEach //router.js router.beforeEach((to, from, next) => { // 若userkey不存在并且前往页面不是登陆页面,进入登陆 // 若userkey存在并且前往登陆

  • Java+mysql用户注册登录功能

    最近刚刚开始学习mysql,所以就写了这个很基本的用户注册登录的功能来练练手.虽然这个很简单,但是我还是看到了自己学习的进步,很开心.哈哈哈. 这里要注意数据表的建立: 直接上代码吧,里面注释很详细了. package client; import java.sql.*; import java.util.*; public class Client { /** * 用以实现用户的注册和登录 */ private static String username;//用户登录注册的姓名 privat

  • eclipse连接数据库并实现用户注册登录功能

    文章目录 MySQL配置环境变量navicat部署tomcat导入驱动修改代码连接mysql数据库运行: MySQL配置环境变量 mysql肯定是必不可少的,这个就不用多说了,自己去官网下载就行我们来配置一下mysql的环境变量 步骤: 我的电脑右键--属性--高级系统--环境变量 在系统变量下点击新建: 变量名:MYSQL_HOME 变量值:C:\phpStudy\PHPTutorial\MySQL 这里的变量值填的是自己mysql所在的文件夹,以自己电脑路径为准 然后找到path,点击编辑,

  • 基于PHP实现用户注册登录功能

    本文介绍的是基于PHP实现用户注册登录功能,本项目分为四部分内容:1前端页面制作,2验证码制作,3实现注册登陆,4功能完善.具体情况可以往下看. 验证码制作 一.实验简介 本次实验将会带领大家使用面向对象的思想封装一个验证码类.并在注册和登陆界面展示使用.通过本次实验的学习,你将会领悟到 PHP 的 OOP 思想,以及 GD 库的使用,验证码生成. 1.1 涉及到的知识点 PHP GD库 OOP编程 1.2 开发工具 sublime,一个方便快速的文本编辑器.点击桌面左下角: 应用程序菜单/开发

  • 小程序云开发之用户注册登录

    本文实例为大家分享了小程序云开发用户注册登录的具体代码,供大家参考,具体内容如下 注册界面和文件 登录界面和文件 这里的UI使用iviewUI 不懂可以看我的另一篇文章IviewUI 先说注册界面 json如下 wxml如下 <!--pages/register/index.wxml--> <view> <i-input bind:change='inputName' maxlength="15" title="账号" autofocu

  • Linux下实现不活动用户登录超时后自动登出

    方法一:通过修改.bashrc或.bash_profile文件来实现 通过修改home目录下的.bashrc或.bash_profile文件来实现.这两个文件选择其中一个在末尾加入如下一行,具体操作如下: [GeekDevOps@GeekDevOps /]$ cd ~ [GeekDevOps@GeekDevOps ~]$ echo "TMOUT=90">>.bashrc [GeekDevOps@GeekDevOps ~]$ source .bashrc 以上代码中我们选择的

随机推荐