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