Django路径问题 - 无法在管理屏幕加载时导入模块

时间:2013-06-28 20:11:47

标签: python django shell path symlink

我为发布的丰富代码/配置而道歉 - 但我很难找到错误,并希望有人能够发现它。这是我第一次使用django / virtualenv,所以我确定它可能是愚蠢的。为了记录,我使用的是Python 2.7和Django 1.5。我在共享服务器上,但我有一个具有所有必要依赖项的虚拟环境。

现在,当我的.urls将所有管理页面注释掉时,我能够看到Django欢迎屏幕。但是,我一直在设置一个sqlite3(我知道它不建议生产)数据库来处理我的一个应用程序,称为用户。

我可以使用python shell成功地将User类型的对象添加到数据库中。所以这不是数据库问题。据我所知,当它试图在某个时刻呈现网页时,它正在调用模块用户,但无法找到它。因此,它必须从项目目录外部调用。这让我觉得我需要在我的路径上添加一些东西?但是我要添加什么?

我的virtualenv site-packages目录中有一个符号链接到我项目的内部文件夹 - 即项目/项目(这是应用程序的内部用户)。所以我的猜测是我需要更改该符号链接以指向外部项目目录吗?

The root of the error


我的项目结构如下:

/project

/project/project_db

/project/manage.py

/project/users/__init__.py

/project/users/admin.py

/project/users/models.py

/project/users/tests.py

/project/users/views.py

/project/project/__init__.py

/project/project/settings.py

/project/project/urls.py

/project/project/wsgi.py

现在,相关文件:

/project/project/settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'project_db',                      # Or path to database file if using sqlite3.
        # The following settings are not used with sqlite3:
        'USER': '',
        'PASSWORD': '',
        'HOST': '',                      # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
        'PORT': '',                      # Set to empty string for default.
    }
}

#...

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
    'users',
)

下一步: /project/users/models.py

from django.db import models

# Create your models here.
class User(models.Model):

    CRAWFORD = 'CR'
    CARPENTER = 'CA'
    NOTAPPLICABLE = 'NA'

    HALL_CHOICES = (
        (CRAWFORD, 'Crawford'),
        (CARPENTER, 'Carpenter'),
        (NOTAPPLICABLE, 'Not Applicable'),
    )

    hall = models.CharField(max_length=2,choices=HALL_CHOICES,default=NOTAPPLICABLE)
    email = models.CharField(max_length=256)
    password = models.CharField(max_length=32)
    supervisor = models.ForeignKey('self',blank=True, null=True, default=None)

    def __unicode__(self):
            return self.email + " " + self.hall

最后:.bash_profile

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

# User specific environment and startup programs

export PATH=$PATH:$HOME/bin:$HOME/virtual/lib/python2.7/site-packages/django/bin:$HOME/website/project
export PYTHONPATH=$PYTHONPATH:$HOME/virtual/lib/python2.7/site-packages:$HOME/website/project

2 个答案:

答案 0 :(得分:0)

假设您发布的.bash_profile来自您的主目录,并且您正在以通常的方式运行Apache,即作为用户root启动的守护进程并且以用户www-dataapache或其他方式分叉子项,然后PYTHONPATH将不会应用于apache进程,因此您必须单独配置它。

如果您正在使用mod_wsgi,那么您可以将以下apache指令添加到您的网络服务器配置中...

WSGIPythonPath $HOME/virtual/lib/python2.7/site-packages:$HOME/website/project

...确保将$HOME替换为主目录的完整绝对路径名,因为它与apache用户不同。


<强>更新

根据指南,您应该创建一个文件~/public_html/dispatch.fcgi,其中包含类似......

的内容
#!/usr/local/bin/python2.6

import sys
import os

# Make sure to change 'username' to your username!
sys.path.append('/home/username/local/lib/python2.6/site-packages')

os.environ['DJANGO_SETTINGS_MODULE'] = 'myproj.settings'

from django.core.servers.fastcgi import runfastcgi
runfastcgi(method="threaded", daemonize="false")

...请检查您是否在sys.path.append()行中放置了正确的路径。

答案 1 :(得分:0)

我已经解决了这个问题。在阅读fastcgi close教程时 - 它注意到您可能需要在public_html目录中为内部项目目录外部的任何包添加符号链接。因此,由于我的应用程序存在于项目中但内部项目目录的外部 - fastcgi需要指向public_html中模块的链接。