0

我经常被 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.modelsNone该函数的范围内。在那个 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

4

2 回答 2

2

开发服务器和 mod_wsgi 之间的差异,以及现在针对 wsgi.py 直接运行时的 gunicorn,是一个不断重复出现的常见主题。这确实是一个难以描述的问题,当人们试图仅仅因为他们没有经历过它而将其视为一个问题时,它令人失望。这是一个真正的问题,如果你在论坛上帮助人们的时间足够长,你就会看到它。

虽然我自己不使用 Django,但我已经尝试了几次来理解这个问题,以便更好地向人们解释问题是什么,但即使这样也没有一个简单的答案。

我之前在博客中讨论过这个问题:

http://blog.dscpl.com.au/2010/03/improved-wsgi-script-for-use-with.html

基本问题归结于这样一个事实,即开发服务器通过加载管理命令将预加载您的 Django 应用程序的大部分并按特定顺序执行。

在 mod_wsgi 和 gunicorn 中,当您不使用 run_gunicorn 管理命令来处理 gunicorn 案例时,事情会被延迟加载,这可能会导致问题,因为可以根据应用程序不同部分的订单请求以任何顺序加载位。

所有问题的根本原因往往是您执行模块导入的顺序,尤其是在您有循环模块导入的情况下。缺少导入也可能是一个问题。

所以存在真正的问题。很难追踪,但要特别注意模块导入。由于某种原因,与模型相关的情况似乎发生了很多。

这是否是您的问题,这是一个不同的问题,但是是的,人们确实看到了开发服务器和生产部署之间的差异。

要进一步调查,需要将实际错误消息添加到您的问题中。

于 2012-08-29T23:48:59.180 回答
1

嗯,这是一个非常普遍的问题,尽管它在很大程度上取决于您的生产环境与开发环境的不同之处。自从我的第一台服务器遇到麻烦以来,现在我以某种方式制定了自己的规则,如何轻松部署。即使当我对服务器进行初始部署(应用程序的第一次部署)时,我肯定总是会遇到一些问题。之后它变得更容易。

  1. 将开发环境和生产环境的设置分开。有很多关于如何在不做太多工作的情况下做到这一点的例子。
  2. 使用 Fabric(或其他自动部署)。如果您在服务器中遇到问题,大多数时候您可以修改您的 fab 脚本,以免下次再次遇到此问题。无论是某个chmod东西,一个south migrate,安装额外的依赖项等。您还可以处理不同的环境,只需先对所有内容进行本地测试。
于 2012-08-29T07:41:06.820 回答