1

在 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:我确实检查了循环导入-无论如何这些都不应该发生,因为我可以在另一个(管理)类中使用我的模型,对吗?

4

0 回答 0