在Django中使用MQTT的方法

文章代码源于这里:https://www.zhuxianfei.com/python/47350.html。

就想偷懒而已,于是直接超了代码。结果运行直接bug了:

Traceback (most recent call last):
  File "/Users/zhongming/PycharmProjects/django-vue-admin/backend/application/baby_mqtt.py", line 11, in <module>
    django.setup()
  File "/Users/zhongming/PycharmProjects/django-vue-admin/backend/venv/lib/python3.8/site-packages/django/__init__.py", line 19, in setup
    configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
  File "/Users/zhongming/PycharmProjects/django-vue-admin/backend/venv/lib/python3.8/site-packages/django/conf/__init__.py", line 82, in __getattr__
    self._setup(name)
  File "/Users/zhongming/PycharmProjects/django-vue-admin/backend/venv/lib/python3.8/site-packages/django/conf/__init__.py", line 63, in _setup
    raise ImproperlyConfigured(
django.core.exceptions.ImproperlyConfigured: Requested setting LOGGING_CONFIG, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

这个错误提示就很高端,往上搜了一遍又一遍发现都是下面一样的代码:

# 为了能在外部脚本中调用Django ORM模型,必须配置脚本环境变量,将脚本注册到Django的环境变量中
import os, sys
import django
# 第一个参数固定,第二个参数是工程名称.settings
os.environ.setdefault('DJANGO_SETTING_MODULE', 'my_django.settings')
django.setup()
 
# 引入mqtt包
import paho.mqtt.client as mqtt
# 使用独立线程运行
from threading import Thread
from app名 import models
import time
import json
 
# 建立mqtt连接
def on_connect(client, userdata, flag, rc):
    print("Connect with the result code " + str(rc))
    client.subscribe('test/#', qos=2)
 
# 接收、处理mqtt消息
def on_message(client, userdata, msg):
    out = str(msg.payload.decode('utf-8'))
    print(msg.topic)
    print(out)
    out = json.loads(out)
 
    # 收到消息后执行任务
    if msg.topic == 'test/newdata':
        print(out)
 
# mqtt客户端启动函数
def mqttfunction():
    global client
    # 使用loop_start 可以避免阻塞Django进程,使用loop_forever()可能会阻塞系统进程
    # client.loop_start()
    # client.loop_forever() 有掉线重连功能
    client.loop_forever(retry_first_connection=True)
 
client = mqtt.Client(client_id="test", clean_session=False)
 
# 启动函数
def mqtt_run():
    client.on_connect = on_connect
    client.on_message = on_message
    # 绑定 MQTT <a href="http://www.zhuxianfei.com/server/" target="_blank" class="infotextkey">服务器</a>地址
    broker = '192.168.1.88'
    # MQTT服务器的端口号
    client.connect(broker, 1883, 62)
    client.username_pw_set('user', 'user')
    client.reconnect_delay_set(min_delay=1, max_delay=2000)
    # 启动
    mqttthread = Thread(target=mqttfunction)
    mqttthread.start()
 
# 启动 MQTT
# mqtt_run()
 
if __name__ == "__main__":
    mqtt_run()

一个字母都不带改的,当然这些抄文章的人肯定自己没试过。因为上面的代码就跑不动,那一行有问题呢?当然就是下面这一行了:

os.environ.setdefault('DJANGO_SETTING_MODULE', 'my_django.settings')

上面的代码应该是:

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'application.settings')

对比一下发现区别了吗?少了个S对不对?这个陷阱真的是太牛逼了,不是语法问题,所以运行的之后不会报语法错误,直接报的django的错误。想排查都不好排查。直到所又从google的代码抄了一份,发现长度不一致,才发现少了个S。不知道是不是作者有意为之,这就很高端。其他的就没什么问题了,加上S就可以正常运行了。

 

☆版权☆

* 网站名称:obaby@mars
* 网址:https://h4ck.org.cn/
* 个性:https://oba.by/
* 本文标题: 《在Django中使用MQTT的方法》
* 本文链接:https://h4ck.org.cn/2022/11/10698
* 短链接:https://oba.by/?p=10698
* 转载文章请标明文章来源,原文标题以及原文链接。请遵从 《署名-非商业性使用-相同方式共享 2.5 中国大陆 (CC BY-NC-SA 2.5 CN) 》许可协议。


You may also like

5 comments

    1. 公主 Queen 
      Google Chrome 102 Google Chrome 102 Mac OS X 10.15 Mac OS X 10.15 cn山东省青岛市 移动

      填下文章一大抄,抄完了也没人验证。不过,这个坑确实留得不错。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注