在 Django 中,我编写了一个自定义命令,称为 update。该命令由 shell 脚本持续调用并更新数据库中的一些值。更新在线程中完成。我把这个类与自定义命令放在同一个模块中做所有线程相关的事情。
在我的生产服务器上,当我尝试运行该 shell 脚本时,当我尝试访问我的模型时出现错误:
antennas = Antenna.objects.all()
错误是:
AttributeError: 'NoneType' object has no attribute 'objects'
但是,如您所见,我确实在该文件中导入了 app.models.Antenna。所以对我来说,似乎对整个站点的引用在线程类中以某种方式“丢失”了。
站点/应用程序/管理/命令/update.py
(我试图在这里删除所有非必要的代码,因为它会使所有内容变得混乱,但我保持导入完好无损)
from django.core.management.base import NoArgsCommand, CommandError
from django.utils import timezone
from datetime import datetime, timedelta
from decimal import *
from django.conf import settings
from _geo import *
import random, time, sys, traceback, threading, Queue
from django.db import IntegrityError, connection
from app.models import Bike, Antenna
class Command(NoArgsCommand):
def handle_noargs(self, **options):
queue = Queue.Queue()
threadnum = 2
for bike in Bike.objects.filter(state__idle = False):
queue.put(bike)
for i in range(threadnum):
u = UpdateThread(queue)
u.setDaemon(True)
u.start()
queue.join()
return
class UpdateThread(threading.Thread):
def init(self, queue):
threading.Thread.init(self)
self.queue = queue
def run(self):
antennas = Antenna.objects.all()
while not self.queue.empty():
try:
[...]
except Exception:
traceback.print_exc(file=sys.stdout)
finally:
self.queue.task_done()
当我尝试
from app.models import Antenna
在 UpdateThread 类中我得到一个错误:
ImportError: No module named app.models
该网站在网络服务器上运行良好。那里没有与模型相关的问题,只有当我在线程内执行任何操作时 - 所有 app.models-imports 都失败了。此外,在我看来,完全相同的配置(我正在使用 git)确实在另一台运行相同操作系统(debian wheezy、python 2.7.3rc2 和 django 1.4.2)的机器上运行。
很可能我在这里遗漏了一些关于线程的明显内容,但我现在被困得太久了。非常感谢您的帮助!
PS:我确实检查了循环导入-无论如何这些都不应该发生,因为我可以在另一个(管理)类中使用我的模型,对吗?