一、实战场景

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

Python基础入门到精通视频合集

【整整800集】Python爬虫项目零基础入门合集,细狗都学会了,你还不会?

二、主要知识点

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

涉及的知识点和细节很多,我下面就直接贴出注册部分的核心代码,有需要源码的小伙伴私信我哦!

三、核心代码

马上安排!

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

'''
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_bpapp.register_blueprint(auth_bp)def create_app(config=None):# 创建应用app = Flask(__name__)# 加载配置app.config.from_object('config')# 注册 SQLAlchemydb.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 appapp = 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 = TrueSQLALCHEMY_DATABASE_URI = 'mysql://username:password@ip:3306/dbname'# 设置sqlalchemy自动更跟踪数据库
SQLALCHEMY_TRACK_MODIFICATIONS = True# 查询时会显示原始SQL语句
SQLALCHEMY_ECHO = True

3、蓝图初始化

from flask import Blueprintauth_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; 20172022</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.nicknameuser.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、用户模型

import randomfrom 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_hashfrom common.helpers.str_helper import random_string
from north import login_managerfrom  base.base_model import BaseModelclass 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))@propertydef password(self):# 定义属性,使用对象属性赋值return self._password@password.setterdef password(self, raw):# 属性赋值self._password = generate_password_hash(raw)def check_password(self, raw):# 检查密码if not self._password:return Falsereturn check_password_hash(self._password, raw)def generate_token(self, expiration=60000):# 生成 tokenreturn random_string(32)@login_manager.user_loader
def get_user(uid):# 必须, login 插件制定方法return User.query.get(int(uid))

7、模型基类

import pymysql
import datetimefrom 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__ = Trueid = 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、表单验证

from wtforms import StringField, PasswordField, Form, validators
# from wtforms.validators import Length, Email, \
#     ValidationError, EqualTo
from app.auth.user.user_model import Userclass 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、登录


兄弟们,今天的分享就到这里,下次见!

【Python项目】Flask + MySQL 实现用户注册,登录、注销相关推荐

  1. php mysql 登录注销_PHP与MYSQL实现用户登录注销

    因为最近才学习php与mysql,为了写留言板的注册,登录与注销功能,接触到php的session会话机制,想要记录下来. Session: 代表服务器与浏览器的一次会话过程(其本来的含义是指有始有终 ...

  2. php查询mysql充值_PHP + MYSQL 实现 用户注册/登录/充值 功能

    前言 这个其实目的只是为了配合软件用的,昨天帮个朋友写个软件需要这种网络验证的功能,太复杂的没研究过,所以自己写了一个简单的.贴上来共同学习,哪里可以改善欢迎提出.有兴趣的朋友可以参考一下 代码< ...

  3. Python Flask微信小程序登录流程及登录api实现代码

    1.小程序端调用wx.login 2.判断用户是否授权 3.小程序端访问 wx.getUserInfo 4.小程序端js代码:+ wx.login({success: resp => {// 发 ...

  4. python django 快速实现注册,登录,注销

    临近年底,各种忙,好久没更新博客了,2017春节假期在即,距下班还有2小时,难得闲下来,来撸一手django简单的web注册,登录,注销. 环   境:centos 6.4 64bit python ...

  5. pythonflask开发web网页编辑_总结Python+Flask+MysqL的web建设技术过程

    一.个人学期总结 本人在一学期时间内学习并实现基于Python的Flask框架web建设项目,python是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年 ...

  6. Python+Flask+MysqL的web建设技术过程

    前言 本人在一学期时间实现了Python+Flask+MysqL的web建设,页面具有简单的登录注册发布文章搜索文章等功能. 这篇文章总结了我最近一段时间的学习成果:使用Flask框架搭建一个web ...

  7. 期末作品检查:总结Python+Flask+MysqL的web建设技术过程

    一.个人学期总结 在一学期里我们学习并实现了基于Python的Flask框架web建设项目,要在一学期里入门一个新的语言并且完成相应的框架项目建,对我这个代码"小白"来说还是非常有 ...

  8. python django用户登录系统_Django实现用户注册登录

    学习Django中:试着着写一个用户注册登录系统,开始搞事情 =====O(∩_∩)O哈哈~===== ================= Ubuntu python 2.7.12 Django 1. ...

  9. 【Python开发】Flask中的单点登录解决方案

    Flask中的单点登录解决方案 1.SSO 和 CAS 单点登录(Single Sign On,SSO)就是通过用户的一次性鉴别登录.当用户在身份认证服务器上登录一次以后,即可获得访问单点登录系统中其 ...

最新文章

  1. 工业机器人的下一个竞争焦点已经非常明确:通用人工智能(AGI)
  2. 不是“老赖”是“真还”!罗永浩 6 亿债务还了 4 亿
  3. 网页版python叫什么-我不想浏览网页,那么我就用Python实现网页自动化朗读!
  4. python爬虫实战(一)--------中国作物种质信息网
  5. java通过ldap添加用户后_ldap连接不上改用户_JAVA通过LDAP做用户登录认证,怎么做业务的异常处理?...
  6. USACO Training Section 1.3混合牛奶 Mixing Milk
  7. 测试Maven版本插件自动递增版本号
  8. C语言 const 修饰函数返回值 - C语言零基础入门教程
  9. python-演练-数据排除-从学生得分中去除题目源中并不存在的题
  10. hadoop使用mapreduce统计词频_hadoop利用mapreduce运行词频统计(非例程)
  11. OCS UCCA 开发笔记(Unified Communications Client API)
  12. tp5 url使用php参数,URL访问 · ThinkPHP5.0完全开发手册 · 看云
  13. 网页回到顶部的js代码实现
  14. 千方百剂创建账套服务器文件,千方百剂辅助工具使用手册(图解).doc
  15. 数字孪生智慧城市建设解决方案
  16. Python 让书法作品和 PIL 库来一场美丽的邂逅
  17. Dynamical Isometry and a Mean Field Theory of CNNs
  18. 空间直角坐标系、左手坐标系、右手坐标系
  19. 【产品】建立二八法则思维模式:精准定位
  20. 如何手动下载并安装 Visual Studio Code 的 SAP Fiori tools - Extension Pack 扩展

热门文章

  1. 先验概率、后验概率、条件概率的形象解释
  2. 计算机表格怎么取消分页,Excel表格自动分页、取消分页等技巧 专家详解
  3. java快速排序的时间复杂度_程序猿必备排序算法及其时间复杂度分析
  4. NOIP 2012 普及组 复赛 culture 文化之旅
  5. 【Spring】IOC理论推导、IOC本质
  6. 苹果机器学习博客姗姗来迟,不过第一篇文章就给紧缺训练数据的研究者们发糖...
  7. Mysql引擎的知识
  8. c语言图形学三角形平移,MFC怎么对所画几何图形进行旋转、填充、放缩???(急用)【...
  9. AFN代码解读(-)
  10. Matlab里怎么注释掉一段(多行)代码