IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 【MongoDB】在Django中MySQL和MongoDB共用 | EMQX 用户数据库 -> 正文阅读

[Python知识库]【MongoDB】在Django中MySQL和MongoDB共用 | EMQX 用户数据库

简要

使用mongoengine、singals实现MySQL和MongoDB的共用。

需求

在不影响原有MySQL表的情况下,加入MongoDB来处理EMQX的用户验证。

代码

模型定义

# models.py
class MQTTUser(models.Model):
    username = models.CharField(max_length=255, db_index=True, null=False, blank=False, unique=True)
    password = models.CharField(max_length=255,  null=False, blank=False)
    salt = models.CharField(max_length=100, null=True, blank=True) #  # 自动生成
    is_superuser = models.BooleanField(default=False)  # 固定
    expired_date = models.DateTimeField(default=timezone.now, null=True)  # 过期时间 null则为不限时
    create_by = models.ForeignKey(User, on_delete=models.CASCADE) 

上面的为MYSQL所使用的模型,那现在我们要使用mongoengine定义Document与MYSQL的模型进行同步。

# models.py
import mongoengine

class MQTTUser_MongoModel(mongoengine.Document):
    username = mongoengine.StringField(max_length=255)
    password = mongoengine.StringField(max_length=255)
    salt = mongoengine.StringField(max_length=100)
    is_superuser = mongoengine.BooleanField(default=False)
    created = mongoengine.DateTimeField()

    meta ={
        "collection": "mqtt_user"
    }

类名定义随意,我习惯性后面加上下划线进行分类,meta中的collection为集合名称,如果不定义集合名称,它自动生成的是根据类名大写来的,如:m_q_t_t_user_mongo_model,建议自定义好类名。

连接

原有settings中存在MySQL引擎的连接。

mongo的连接

定义好两个模型后,我们需要先加入mongo的连接定义,在Django的配置文件数据库配置后面加上即可。

# settings.py
...
# 原有的MySQL配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '',
        'USER': '',
        'PASSWORD': '',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    },
}
# 添加
from mongoengine import connect  
connect(host='mongodb://<username>:<password>@<host>:<port>/<database>?authSource=admin') 

connect的参数如下:

  • db=None,
  • name=None,
  • host=None,
  • port=None,
  • read_preference=READ_PREFERENCE,
  • username=None,
  • password=None,
  • authentication_source=None,
  • authentication_mechanism=None,

这里用到host参数,如mongodb://admin:admin@localhost:27017/emqx?authSource=admin
后面的authSource=admin是必要的,指明mongo的验证集合。

模型之间的连接

我们可以使用Django的信号函数,在MQTTUser模型创建新纪录后(post_save)调用create_mqtt_user_in_emq函数,传入实例,在函数中调用实例创建后信息进行Mongo中的创建。

from django.dispatch import receiver
from django.db.models import signals
@receiver(signals.post_save, sender=MQTTUser)
def create_mqtt_user_in_emq(sender, instance, created, **kwargs):
    if created:
        MQTTUser_MongoModel.objects.create(
            username=instance.username, 
            password=instance.password, 
            salt=instance.salt, 
            is_superuser=instance.is_superuser, 
            created=instance.created, 
            )
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-05-08 08:03:10  更:2022-05-08 08:03:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 15:20:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码