2011-11-08 1 views
3

아파치 배포 지침에 따라 장고 앱을 배포하고 완벽하게 아파치와 mod_python으로 작업했습니다. 그러나 프로젝트 구조를 다소 바꿨으므로 제대로 작동하지 못했습니다. 내가 노력할 상관없이, 나는 다음과 같은 페이지 받고 없습니다 계속 : 여러 스레드를 읽기문제 해결 방법 - ImportError : django를 배포 할 때 'mysite.settings'설정을 가져올 수 없습니까?

MOD_PYTHON ERROR 

ProcessId:  27841 
Interpreter: '127.0.0.1' 

ServerName:  '127.0.0.1' 
DocumentRoot: '/var/www' 

URI:   '/myapp/' 
Location:  '/myapp/' 
Directory:  None 
Filename:  '/var/www/myapp' 
PathInfo:  '/' 

Phase:   'PythonHandler' 
Handler:  'django.core.handlers.modpython' 

Traceback (most recent call last): 

    File "/usr/lib/python2.6/dist-packages/mod_python/importer.py", line 1537, in HandlerDispatch 
    default=default_handler, arg=req, silent=hlist.silent) 

    File "/usr/lib/python2.6/dist-packages/mod_python/importer.py", line 1229, in _process_target 
    result = _execute_target(config, req, object, arg) 

    File "/usr/lib/python2.6/dist-packages/mod_python/importer.py", line 1128, in _execute_target 
    result = object(arg) 

    File "/usr/local/lib/python2.6/dist-packages/Django-1.3.1-py2.6.egg/django/core/handlers/modpython.py", line 212, in handler 
    return ModPythonHandler()(req) 

    File "/usr/local/lib/python2.6/dist-packages/Django-1.3.1-py2.6.egg/django/core/handlers/modpython.py", line 174, in __call__ 
    self.load_middleware() 

    File "/usr/local/lib/python2.6/dist-packages/Django-1.3.1-py2.6.egg/django/core/handlers/base.py", line 39, in load_middleware 
    for middleware_path in settings.MIDDLEWARE_CLASSES: 

    File "/usr/local/lib/python2.6/dist-packages/Django-1.3.1-py2.6.egg/django/utils/functional.py", line 276, in __getattr__ 
    self._setup() 

    File "/usr/local/lib/python2.6/dist-packages/Django-1.3.1-py2.6.egg/django/conf/__init__.py", line 42, in _setup 
    self._wrapped = Settings(settings_module) 

    File "/usr/local/lib/python2.6/dist-packages/Django-1.3.1-py2.6.egg/django/conf/__init__.py", line 89, in __init__ 
    raise ImportError("Could not import settings '%s' (Is it on sys.path?): %s" % (self.SETTINGS_MODULE, e)) 

ImportError: Could not import settings 'settings' (Is it on sys.path?): No module named settings 

하는 문제는 다음

  • 잘못된 아파치 설정 파일
  • 잘못된 sys.path에
  • 중 하나가 될 수있다
  • 모든 파일 또는 디렉토리에 대한 사용 권한이 올바르지 않습니다.
  • 내 장고 사이트 코드의 버그

문제를 줄이는 방법이 있습니까? 예를 들어, 오류가 발생했을 때 sys.path가 무엇인지 알아낼 방법이 있습니까? 여기서 도움이되는 로그 파일이 있습니까? "파일을 찾을 수 없습니다"와 "파일을 읽을 권한이 없습니다"를 구별 할 수있는 방법이 있습니까? 나는 솔루션에 비틀 거릴 때까지 무작위로 시도하는 것보다 과학적으로 솔루션에 접근하고 싶습니다.

이 질문은 다음과 같은 질문이 아닙니다 : Mod_python error: ImportError: Could not import settings. 솔루션 자체보다는 가능한 솔루션을 좁히는 데 도움이되는 방법을 구체적으로 묻습니다.

+0

virtualenv 또는 글로벌 Python을 사용하고 있습니까? 또한 .wsgi conf 파일을 게시 할 수 있습니까? 이것은 설정 모듈을 가져 오는 곳이며 문제가있는 곳일 수 있습니다 –

+0

프로젝트 파일 트리를 게시하십시오. –

+0

저는 제 문제에 대한 해결책보다는 일반적인 문제 해결 요령을 정말로 찾고 있습니다. 남자에게 물고기를주세요. – amarillion

답변

7

좋아, 문제를 직접 알아 냈어. 그래서 내 자신의 질문에 대답 할께. 아파치 로그 나 다른 정보 출처가 없어서 가져 오기 오류의 원인을 정확하게 파악할 수 없습니다. 그래서 저는 아래의 방법을 좀 더 "합리적인"접근 방법으로 공유합니다. 누군가가 무작위로 변경하는 몇 시간을 절약 할 수 있기를 바랍니다.

기록을 위해 여기에 사용한 Apache 구성이 있습니다.

<Location "/mysite/"> 
    SetHandler python-program 
    PythonHandler django.core.handlers.modpython 
    SetEnv DJANGO_SETTINGS_MODULE mysite_django.settings 
    PythonOption django.root /mysite 
    PythonDebug On 
    PythonPath "['/home/mysite/prg/mysite/mysite_django', '/home/mysite/prg/mysite'] + sys.path" 
</Location> 

나는 서버에서 사용자가 "내 사이트"를 생성하고, 장고 settings.py는 (다소 중복 이름) 위치 /home/mysite/prg/mysite/mysite_django/settings.py에 있습니다. 서버에 ssh 채널을 엽니 다. 이 경우 나는 사용자 사이를 빠르게 전환 할 매우 유용한 screen 유틸리티를 사용하여 (그러나 두 번째 SSH 채널은 잘 작동)

screen 

에서 Ctrl-A, Ctrl-C를 새로운 화면을 만들 수 있습니다. 는 이제 아파치가하는대로 정확하게 권한을 참조하는 것이 중요합니다, 그래서 데비안 시스템에 www가 데이터입니다 아파치를 실행하는 사용자로 전환 : 내가 settings.py를 가져올거야

sudo -i -u www-data 

가 우리가 일반 파이썬을 실행하고 있기 때문에

python 

>>> import os, sys 
>>> print sys.path 
... result omitted ... 

이 분명히은 "내 사이트"디렉토리의 어떤없이 당신에게 표준의 sys.path를 제공해야합니다 : 자신 파이썬 환경에서. 그래서 sys.path를 다음과 같이 수정했습니다. 내가 복사 - 붙여 넣기 아파치 구성에서 직접, 오타를 방지하기 위해 :

예상대로
>>> sys.path = ['/home/mysite/prg/mysite/mysite_django', '/home/mysite/prg/mysite'] + sys.path 
>>> import mysite_django.settings 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: No module named mysite_django.settings 

, 나는 브라우저에서 내 사이트를로드 할 때 이미 본 같은 오류가 발생합니다. 그래서 파이썬 환경에서 문제를 재현 할 수 있습니다.확실히, 빌드 경로는 sys 경로 항목 '/ home/mysite/prg/mysite'와 요청 된 가져 오기 경로 'mysite_django/settings.py'를 합쳐서 만들어 져야합니다. 그렇다면 왜 수입하지 않는가? 주어진 sys 경로 항목이 실제로 존재하는지 확인하십시오.

>>> os.path.exists (sys.path[0]) 
False 

존재하지 않습니까? 이상한.

>>> os.path.exists ('/home') 
True 
>>> os.path.exists ('/home/mysite') 
True 
>>> os.path.exists ('/home/mysite/prg/') 
True 
>>> os.path.exists ('/home/mysite/prg/mysite') 
True 
>>> os.path.exists ('/home/mysite/prg/mysite/mysite_django') 
False 

여기에 mysite_django의 권한에 문제가 있다는 것을 알고 있습니다. 아마 내가 만든 모든 무작위적인 변화에서 남은 것 일거야. 그러나 실제로, 문제는 위의 디렉토리 인 mysite에서 디렉토리 목록을 읽으려고 시도하기 때문에 발생합니다. 나는 Ctrl 키-A, Ctrl 키-N과 수퍼 유저 화면으로 전환, 그리고 나는 그들이 성공의 마지막 디렉토리와 동일한되도록 내 사이트의 사용 권한을 설정하는 chmod를 사용

$ ls -la /home/mysite/prg 
total 12 
drwxr-xr-x 3 mysite mysite 4096 2011-11-08 11:24 . 
drwxr-xr-x 7 mysite mysite 4096 2011-11-08 14:56 .. 
drwxr-xr-- 6 mysite mysite 4096 2011-11-08 11:35 mysite 
$ chmod o+x /home/mysite/prg/mysite/ 
$ ls -la /home/mysite/prg 
total 12 
drwxr-xr-x 3 mysite mysite 4096 2011-11-08 11:24 . 
drwxr-xr-x 7 mysite mysite 4096 2011-11-08 14:56 .. 
drwxr-xr-x 6 mysite mysite 4096 2011-11-08 11:35 mysite 

www가 다시 전환 Ctrl 키-A, Ctrl 키-N과 - 데이터 화면 : 마지막 시험

>>> import mysite_django.settings 
>>> 

야호 지금

>>> os.path.exists ('/home/mysite/prg/mysite/mysite_django') 
True 
>>> os.path.exists ('/home/mysite/prg/mysite/mysite_django/settings.py') 
True 

! 성공 우리는 심지어 더 나아가 그 장고 사이트가 브라우저에서 다시 작동 된이 시점에서

>>> from django.core.management import setup_environ 
>>> setup_environ(mysite_django.settings) 
'/home/mysite/prg/mysite/mysite_django' 

을로드 할 수 있습니다 테스트 할 수 있습니다.

다음 단계를 수행하면 최소한을 확인 할 수 있습니다

  • 는 아파치의 PYTHONPATH 설정에서 실수가없는 사용자 www가 데이터에 대한 settings.py에 대한 아무런 권한 문제가없는 내 장고 1.5 mod_wsgi에 대한 settings.py
+0

내 os.path.exists ('/ home/mysite/prg/mysite/mysite_django/settings.py ')는 true이지만 mysite_django.settings를 가져올 수 없습니다. mysite_django.settings Help라는 모듈이 없습니다 ... – Robert

2

를 가져올 때 구성

  • 더 런타임 오류가없는, 내가 이런 식으로 해결 :

    ,

    을 httpd.conf :

    WSGIScriptAlias /mysite "/var/www/html/mysite/mysite/wsgi.py" 
    WSGIPythonPath "/var/www/html/mysite/mysite" 
    <Directory "/var/www/html/mysite/mysite"> 
        Order deny,allow 
        Allow from all 
    </Directory> 
    

    wsgi.py :
    sys.path.append (경로) mysite.settings는 아래와 같은 오류를 방지하기 위해

    import os 
    import sys            #new 
    path = '/var/www/html/mysite'       #new 
    if path not in sys.path:        #new 
        sys.path.append(path)        #new 
    
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings") 
    from django.core.wsgi import get_wsgi_application 
    application = get_wsgi_application() 
    

    다른 일을, 알려진 수 있도록

    Premature end of script headers: wsgi.py 
    

    당신은 httpd.conf에

    ,369에서 CGI의 구성을 제거해야합니다
    AddHandler cgi-script .py