2014-11-24 2 views
1

공유 서버에서 호스팅되는 Django 기반 웹 사이트 (예 : 제한된 계정 만 있고 관리자 권한 없음)를 실행하고 있습니다. 서버 관리자는 Python 2.7 용 Django 모듈을 설치했으나 지금은 장고 표백제라고 불리는 제 3 자 Django 라이브러리를 추가하려고합니다. 그래서 나는 지시 in the django-bleach documentation, 나는 settings.py 내 INSTALLED_APPS 목록에 '장고 - 표백제'을 추가 한 다음, 그 다음 Django가 로컬에 설치된 Python 모듈을 찾을 수 없습니다.

pip install --user django-bleach 

을 사용하여 로컬로 설치되어 있어야합니다. 그러나, 내 코드를 다시로드하기 위해 wsgi.py을 만졌을 때 Apache 로그에 ImportError가 있습니다. 보통 이것은 내가 가져 오려고하는 모듈이 PYTHONPATH에 없다는 것을 의미하므로 wsgi.pyprint sys.path 문을 넣습니다. sys.path에 세 번 나타나는 /users/ejt64/.local/lib/python2.7/site-packages/ 디렉토리, 장고 - 표백제가 설치되어있는 내 사용자 로컬 파이썬 위치입니다

[Mon Nov 24 13:44:58 2014] [error] sys.path is: ['/extra/www/html/quotes/quotes_django', '/opt/rh/python27/root/usr/lib64/python2.7/site-packages', 
'/usr/lib64/python27.zip', '/usr/lib64/python2.7', '/usr/lib64/python2.7/plat-linux2', '/usr/lib64/python2.7/lib-tk', '/usr/lib64/python2.7/lib-old', 
'/usr/lib64/python2.7/lib-dynload', '/usr/lib64/python2.7/site-packages', '/usr/lib/python2.7/site-packages', '/users/ejt64/.local/lib/python2.7/site-packages', 
'/users/ejt64/.local/lib/python2.7/site-packages', '/users/ejt64/.local/lib/python2.7/site-packages'] 
[Mon Nov 24 13:44:58 2014] [error] mod_wsgi (pid=29372): Target WSGI script '/extra/www/html/quotes/quotes_django/quotes_django/wsgi.py' cannot be loaded as Python module. 
[Mon Nov 24 13:44:58 2014] [error] mod_wsgi (pid=29372): Exception occurred processing WSGI script '/extra/www/html/quotes/quotes_django/quotes_django/wsgi.py'. 
[Mon Nov 24 13:44:58 2014] [error] Traceback (most recent call last): 
[Mon Nov 24 13:44:58 2014] [error] File "/extra/www/html/quotes/quotes_django/quotes_django/wsgi.py", line 17, in <module> 
[Mon Nov 24 13:44:58 2014] [error]  application = get_wsgi_application() 
[Mon Nov 24 13:44:58 2014] [error] File "/opt/rh/python27/root/usr/lib64/python2.7/site-packages/django/core/wsgi.py", line 14, in get_wsgi_application 
[Mon Nov 24 13:44:58 2014] [error]  django.setup() 
[Mon Nov 24 13:44:58 2014] [error] File "/opt/rh/python27/root/usr/lib64/python2.7/site-packages/django/__init__.py", line 21, in setup 
[Mon Nov 24 13:44:58 2014] [error]  apps.populate(settings.INSTALLED_APPS) 
[Mon Nov 24 13:44:58 2014] [error] File "/opt/rh/python27/root/usr/lib64/python2.7/site-packages/django/apps/registry.py", line 85, in populate 
[Mon Nov 24 13:44:58 2014] [error]  app_config = AppConfig.create(entry) 
[Mon Nov 24 13:44:58 2014] [error] File "/opt/rh/python27/root/usr/lib64/python2.7/site-packages/django/apps/config.py", line 87, in create 
[Mon Nov 24 13:44:58 2014] [error]  module = import_module(entry) 
[Mon Nov 24 13:44:58 2014] [error] File "/usr/lib64/python2.7/importlib/__init__.py", line 37, in import_module 
[Mon Nov 24 13:44:58 2014] [error]  __import__(name) 
[Mon Nov 24 13:44:58 2014] [error] ImportError: No module named django_bleach 

참고 :이 발생하는 것입니다. 아파치 프로세스가 내 디렉토리에 접근하는 권한 문제를 일으키는 경우를 대비하여이 디렉토리를 세계에서 읽을 수있게 만들었습니다. 어떻게 ImportError를 얻을 수 있습니까?

난 그냥 내 장고 응용 프로그램 디렉토리에 파이썬을 실행하는 경우, 나는이 작업을 수행 할 수 있기 때문에,하지만 WSGI/장고, 함께 할 수있는 뭔가가 있어야합니다 :

Python 2.7.5 (default, Dec 3 2013, 08:35:16) 
[GCC 4.4.6 20120305 (Red Hat 4.4.6-4)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import django_bleach 
>>> 

을하지만 내 장고 응용 프로그램을 어떻게 든 찾을 수 없습니다 django_bleach 모듈은 올바른 위치에서보고있다.

추가 정보 :

import os 
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "quotes_django.settings") 

import sys 
print >>sys.stderr, "sys.path is: " + str(sys.path) 

from django.core.wsgi import get_wsgi_application 
application = get_wsgi_application() 
+0

'--user'를 사용하여 설치하지 않는 것은 무엇입니까? – iamkhush

+0

귀하의 의견이 무엇을 의미하는지 모르겠습니다. 이 서버에서 root/sudo 권한이 없기 때문에'--user'를 사용하여 django-bleach를 설치해야합니다. – Edward

+0

'wsgi' 파일은 어떻게 생겼습니까? Python 버전을 거기에 매핑 할 수 있습니다. –

답변

2

글쎄, 마침내 내 문제를 해결했습니다. /users/ejt64/.local/lib/python2.7/site-packages/이 WSGI에 의해 PYTHONPATH에서 검색되었지만, 그 경로를 따라 디렉토리 중 하나를 만드는 것을 잊었습니다. 이므로 Apache 사용자가 액세스 할 수 없습니다.모든 디렉토리 및 파일을 읽을 수을 세계적되었지만

, 그것을 포함하는 모든 디렉토리에 실행 권한을 가지고 있지 않는 사용자는 세계 읽을 수있는 파일을 읽을 수 있고, 홈 디렉토리 (/users/ejt64 밝혀)는 세계에서 읽을 수 있지만 세계에서 실행 가능하지는 않았습니다. 이 디렉토리를 세계에서 실행 가능하게 만들었 으면 ImportError이 사라졌습니다.

PYTHONPATH에서 디렉토리를 읽으려고 시도하지만 권한으로 인해 액세스 할 수 없을 때 Apache/WSGI/Python에서 오류 메시지를 인쇄하도록 만들면 확실히 좋을 것입니다.

-1
~/.local/lib/python2.7/site-packages/ 

는 사용자 실행 아파치에 상대적입니다 : 내 wsgi.py 그냥 django-admin startproject에 의해 생성 된 하나의 표준, 플러스 인쇄 문입니다. 어떤 사용자가 아파치를 실행하고 있습니까? 일반적으로 아파치는 기본 사용자 'nobody'또는 'apache'로 실행됩니다. 상대 경로가 '~'이면 아파치를 실행하는 사용자의 홈 디렉토리를 가리 킵니다.

로컬 핏 패키지의 절대 경로를 지정하거나 virtualenv를 사용하는 것이 좋습니다. site-packages 디렉토리로 가서 pwd을 실행하면 절대 경로를 알 수 있습니다. apache를 실행하는 사용자가 읽기/쓰기/실행할 수없는 경우 pip 패키지 및 디렉토리의 권한을 변경해야 할 수도 있습니다.

모든 것을 사용자로 실행하고 '~'가 홈 디렉토리를 가리 키기 때문에 Python REPL에 포함하면 잘 작동합니다.

당신이 당신의 서버에 아파치 설정 파일을 편집 할 수있는 경우, 나는이 장고 문서에서 보라는 권유를 줄 https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/modwsgi/#using-a-virtualenv 당신은 여전히 ​​따라이 설정해야하는 VIRTUALENV를 사용하지 않는 경우 이벤트 로컬 site-packages 디렉토리의 절대 경로로 이동하십시오.

WSGIPythonPath /path/to/mysite.com:/path/to/your/venv/lib/python3.X/site-packages 
+0

당신은 완전히 옳았 습니다만, 제 질문에 오해의 소지가있었습니다. 아파치가 출력 한 PYTHONPATH는 실제로'~'경로가 아닌 내 사용자의 홈 디렉토리에 대한 절대 경로를 포함합니다. 나는 예제에서 내 사용자 이름을 포함하는 것이 혼란 스러울 것이라고 생각했습니다. – Edward

관련 문제