在Django中使用MQTT的方法

2023-02-22 14:49:35 浏览数 (1)

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

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

代码语言:javascript复制
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.

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

代码语言:javascript复制
# 为了能在外部脚本中调用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()

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

代码语言:javascript复制
os.environ.setdefault('DJANGO_SETTING_MODULE', 'my_django.settings')

上面的代码应该是:

代码语言:javascript复制
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'application.settings')

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

☆文章版权声明☆

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


分享文章:

相关文章:

  1. 由apscheduler引发的django.db.utils.InternalError: (1054, u”Unknown column ‘rms.go_datetime’ in ‘field list'”)
  2. Django 限制访问频率
  3. 关于若依Python(Django-Vue-Admin)的一些设置
  4. Django 代码保护
  5. django使用多个数据库
  6. django raw_id_fields 显示名称而不是id(raw_id_fields: How to show a name instead of id)
  7. Python3 requests 下载进度条
  8. M1 Mac 安装Tensorflow
  9. 性感美女爬虫 Windows【22.01.11】
  10. can’t open file ‘< unprintable file name>’: [Errno 2] No such file or directory

0 人点赞