文章代码源于这里: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就可以正常运行了。
5 comments
抄文章的太多了,很多自己不验证的
填下文章一大抄,抄完了也没人验证。不过,这个坑确实留得不错。
文章头的配图真是……还好我划得快!
哈哈哈。惊不惊喜,意不意外
深夜……在家……一人……我说我来学习的你信吗?