我经常被 django 测试服务器和 apache/wsgi 生产环境之间的差异所困扰。在测试服务器中完美运行的代码在部署后总是失败,而且调试通常看起来非常困难。这次它甚至找不到django.db.models
:,(
模板
{{one_medal_owningship.get_medal_name}}
模型.py
from django.db import models
class MedalsManager(models.Manager):
_cache={}
def get_by_owningship(self,owningship):
return self.__class__._cache[owningship.medal_id]
...
class Medals(models.Model):
name=models.Charfield(max_length=50)
objects=MedalsManager()
...
class MedalOwningship(models.Model):
medal=models.ForeignKey('app.Medals')
user=models.ForeignKey('auth.User')
def get_medal_name(self):
return models.get_model("app","Medal").objects.get_by_owningship(self).name #Here is ***the problem***, models is reported as None
import signal_listeners #I put signal listeners in a separated file and register them here
信号监听器.py
# site_settings.py is a file in the root of the project for storing some control variables, like the number of posts you can post a day
import site_settings #This is the "cause" of the problem, if I change it to myproject.site_settings then everything works.
在互联网上搜索这通常会导致非常具体的案例,很难从中获得完整的图片。我想知道是否有任何关于如何避免这些麻烦的经验法则,任何阅读清单或教程?并且服务器环境的设置是否可能导致代码中不必要的错误(比如 django 和 python 版本与开发环境相同)?非常感谢!
更新:
我以某种方式解决了问题,但不知道原因。所以在上面的代码中,执行时会引发错误a_medal_owningship.get_medal_name
,显然是django.db.models
在None
该函数的范围内。在那个 models.py 文件中,我导入了一个 signal_listener 文件。如果我将 signal_listeners 中的 site_settings(自定义常量存储)的导入方式从import site_settings
更改为import myproject.site_settings
,问题就解决了。
但是,如果我从项目根目录导入另一个随机文件,例如import foobar
,就不会有任何问题。因此,必须将 site_settings 导入其他地方以及在此处导入会导致问题。
这对我来说毫无意义,因为导入自定义文件如何与 django 的默认模块冲突?import foo
和和有什么区别import myproject.foo
?