首页 文章

Django和Buildout部署问题

提问于
浏览
1

我试图通过buildout部署我现有的django项目,松散地遵循指令here .

我的buildout.cfg文件是:

[buildout]
parts       =     django python
develop     =     .
eggs        =     myproject

[django]
recipe      =     djangorecipe
version     =     1.2.3
project     =     myproject
projectegg  =     myproject
settings    =     settings
wsgi        =     true
eggs        =     ${buildout:eggs}

[python]
recipe      =     zc.recipe.egg
interpreter =     python
eggs        =     ${buildout:eggs}

有两个问题:

  • 首先,如果我通过./bin/python调用python解释器,导入myproject会出现导入错误

  • 其次,如果我尝试加载django.wsgi文件,我也会收到apache错误

[Sun Oct 03 11:57:37 2010] [error] [client ::1] mod_wsgi (pid=5045): Target WSGI script '/usr/src/django/myproject/bin/django.wsgi' cannot be loaded as Python module.
[Sun Oct 03 11:57:37 2010] [error] [client ::1] mod_wsgi (pid=5045): SystemExit exception raised by WSGI script '/usr/src/django/myproject/bin/django.wsgi' ignored.
[Sun Oct 03 11:57:37 2010] [error] [client ::1] Traceback (most recent call last):
[Sun Oct 03 11:57:37 2010] [error] [client ::1]   File "/usr/src/django/myproject/bin/django.wsgi", line 20, in 
[Sun Oct 03 11:57:37 2010] [error] [client ::1]     application = djangorecipe.wsgi.main('myproject.settings', logfile='')
[Sun Oct 03 11:57:37 2010] [error] [client ::1]   File "/usr/src/django/myproject/eggs/djangorecipe-0.20-py2.6.egg/djangorecipe/wsgi.py", line 15, in main
[Sun Oct 03 11:57:37 2010] [error] [client ::1]     sys.exit(1)

我的django.wsgi文件是(根据建议的更改更新):

#!/usr/bin/python


import sys
sys.path[0:0] = [
  '/usr/src/django/myproject/src',
    '/usr/src/django/myproject/eggs/djangorecipe-0.20-py2.6.egg',
    '/usr/src/django/myproject/eggs/zc.recipe.egg-1.3.2-py2.6.egg',
    '/usr/src/django/myproject/eggs/zc.buildout-1.5.1-py2.6.egg',
    '/usr/local/lib/python2.6/dist-packages',
    '/usr/local/lib/python2.6/dist-packages',
    '/usr/src/django/myproject/parts/django',
    '/usr/src/django/myproject/eggs/setuptools-0.6c12dev_r85190-py2.6.egg',
    '/usr/src/django/myproject/parts/django',
    '/usr/src/django/myproject',
    '/usr/src/django/myproject/src(/usr/src/django/myproject)',
    '/usr/src/django/myproject',
  ]

import djangorecipe.wsgi

application = djangorecipe.wsgi.main('myproject.settings', logfile='')

我的bin / django文件是:

#!/usr/bin/python

import sys
sys.path[0:0] = [
    '/usr/src/django/myproject/src',
    '/usr/src/django/myproject/eggs/djangorecipe-0.20-py2.6.egg',
    '/usr/src/django/myproject/eggs/zc.recipe.egg-1.3.2-py2.6.egg',
    '/usr/src/django/myproject/eggs/zc.buildout-1.5.1-py2.6.egg',
    '/usr/local/lib/python2.6/dist-packages',
    '/usr/local/lib/python2.6/dist-packages',
    '/usr/src/django/myproject/parts/django',
    '/usr/src/django/myproject/eggs/setuptools-0.6c12dev_r85190-py2.6.egg',
    '/usr/src/django/myproject/parts/django',
    '/usr/src/django/myproject',
    '/usr/src/django/myproject/src(/usr/src/django/myproject)',
    '/usr/src/django/myproject',
    ]


import djangorecipe.manage

if __name__ == '__main__':
    djangorecipe.manage.main('myproject.settings')

导入或apache服务器似乎都没有工作

4 回答

  • 0

    你的问题是你的食谱中的鸡蛋依赖性设置错了

    在buildout部分中

    eggs = myproject
    

    您将自己的myproject django项目设置为依赖项目

    在此设置中,您需要设置所有与django项目相关的python egg(包)

    例如

    eggs =
        psycopg2
        south
        django-debug-toolbar
        django-extensions
    

    如果您的项目使用postgresql psycopg2连接器,则南部用于数据库迁移和django-debug-toolbar和django-extensions

    除了这个列表,您可以在python系统中安装任何软件包 .

    eggs 设置中删除您的项目,这会混淆您的buildout .

  • 0

    可能你需要为你的项目设置额外的路径,所以它将放在python路径上 . 你能粘贴你的django.wsgi和django文件吗?

    试试这个配置:

    [buildout]
    parts       =     django python
    develop     =     .
    eggs        =     myproject
    extra_paths = 
        src(path_to your_project_source)
        ${buildout:directory}
    
    [django]
    recipe      =     djangorecipe
    version     =     1.2.3
    project     =     myproject
    projectegg  =     myproject
    settings    =     settings
    wsgi        =     true
    eggs        =     ${buildout:eggs}
    extra-paths = ${buildout:extra_paths}
    
    [python]
    recipe      =     zc.recipe.egg
    interpreter =     python
    eggs        =     ${buildout:eggs}
    extra-paths = ${buildout:extra_paths}
    

    您还可以确保django.wsgi具有可执行权限

    chmod +x django.wsgi
    
  • 1

    看起来很奇怪的一件事:你的bin / django和bin / django.wsgi文件中的 '/usr/src/django/myproject/src(/usr/src/django/myproject)' .

    我从未见过那些()的东西 . 看起来它可能会破坏事物 .

    最好的选择:跑步吧

    $> bin/python
    >>> import sys
    >>> print sys.path
    

    并看看python本身认为它的路径是什么 . Buildout设置好了,但你在脚本中有一些我以前从未见过的东西 .

    另一种选择:您确定您的实际代码不包含导致应用程序导入错误的导入错误(如果您依赖于像PIL或cx_oracle这样的c级库,有时会发生这种情况) .

  • 3

    对我来说有用的只是根本没有接触到扩建本身,只是确保在执行 .wsgi 脚本时所有的蛋都在 PYTHONPATH 中 . .wsgi 脚本本身如下所示:

    import os
    import sys
    
    PREFIX = '/path/to/my/app'  # the buildout is here
    
    BUILDOUT_EGGS = [
        'Django-1.3-py2.6.egg',
        'South-0.7.6-py2.6.egg',
        'django_haystack-1.2.7-py2.6.egg',
        'djangopypi-0.4.4-py2.6.egg',
        'docutils-0.9.1-py2.6.egg',
        'setuptools-0.6c12dev_r88846-py2.6.egg',
        'zc.recipe.egg-1.3.2-py2.6.egg',
        'Whoosh-2.4.1-py2.6.egg',
        'django_registration-0.8_alpha_1-py2.6.egg',
        'djangorecipe-1.2.1-py2.6.egg',
    #    'pkginfo-0.9-py2.6.egg',                                                                                                                                                                                                                                  
    #    'zc.buildout-1.6.0-py2.6.egg',                                                                                                                                                                                                                            
    
    ]
    
    sys.path[0:0] = [PREFIX] + ['%s/eggs/%s' % (PREFIX, egg) for egg in BUILDOUT_EGGS]
    
    os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings'
    
    import djangorecipe.wsgi
    application = djangorecipe.wsgi.main('myapp.settings', logfile='myapp.log')
    

相关问题