2016-08-04 15 views
6

Tôi đang cố gắng để phục vụ một dự án django chút với cấu hình Apache sau:Apache với virtualenv và mod_wsgi: ImportError: Không có mô-đun có tên là 'django'

Apache VirtualHost cấu hình:

<VirtualHost *> 
    ServerName servername 

    [...] 

    <Directory "/path/to/project/project"> 
     <Files wsgi.py> 
      Require all granted 
     </Files> 
    </Directory> 

    WSGIDaemonProcess project python-path=/path/to/project:/path/to/Envs/venv/lib/python3.5/site-packages       
    WSGIScriptAlias//path/to/project/project/wsgi.py 

</VirtualHost> 

Tôi cũng có wsgi.py sau:

import os 
from django.core.wsgi import get_wsgi_application 

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "example.settings") 
application = get_wsgi_application() 

Tôi không có vấn đề gì để phân phát tệp STATIC và tệp MEDIA.

Tôi cũng đã kiểm tra quyền và đã cố gắng đệ quy sử dụng 755, sau đó 777 vào thư mục gói trang web ảo của tôi. Nó không hoạt động.

Nhưng khi cố gắng để đạt được mục gốc của trang web của tôi, tôi nhận được như sau:

from django.core.wsgi import get_wsgi_application 
ImportError: No module named 'django' 

Tôi đoán rằng đó là một con đường Python vấn đề liên quan kể từ django được cài đặt trong virtualenv tôi. Nhưng tôi đã thêm các đường dẫn python có liên quan vào thuộc tính của WSGIDaemonProcess vì vậy tôi không hiểu tại sao nó không hoạt động.

Tôi cũng đoán tôi có thể add the relevant directory to my Python path in my wsgi.py by using the site module, nhưng tôi muốn hiểu tại sao cấu hình Apache mà tôi đã thử không đủ. Tôi đã bỏ lỡ một cái gì đó?

Trả lời

15

Bạn đang thiếu một tùy chọn chỉ thị hoặc tương đương WSGIProcessGroup hoặc tương đương trên WSGIScriptAlias, vì vậy ứng dụng của bạn không thực sự được chạy trong nhóm quy trình daemon nơi bạn đã đặt môi trường ảo.

Xem Using mod_wsgi daemon mode

tôi cũng khuyên bạn nên đảm bảo nhóm ứng dụng được thiết lập để '% {GLOBAL}' nếu đó là ứng dụng duy nhất mà bạn đang chạy trong nhóm quá trình daemon.

Vì vậy sử dụng:

WSGIScriptAlias//path/to/project/project/wsgi.py \ 
    process-group=project application-group=%{GLOBAL} 

Cũng tốt hơn để sử dụng python-home cho môi trường ảo.

WSGIDaemonProcess project python-path=/path/to/project \ 
     python-home=/path/to/Envs/venv 

Xem:

2

đại diện của tôi là không quá 50 vì vậy tôi không thể bình luận, nhưng tôi muốn chia sẻ khám phá của tôi.

Trong WSGIDaemonProcess, nếu bạn đang sử dụng Python 3.5, bạn cần phải thiết lập một cách chính xác như @ graham-dumpleton nói, với

python-home=/path/to/Envs/venv 

thiết lập một cách rõ ràng.

Tuy nhiên, nếu bạn đang sử dụng Python 3.4 (hoặc một số phiên bản cũ hơn của Python như 2.7 như tôi biết), bạn sẽ phải định cấu hình nó là

python-path=/path/to/project:/path/to/Envs/venv/lib/python3.4/site-packages 

giống như những gì người hỏi đã làm.

Thật kỳ lạ.

+1

Nếu sử dụng Python 3.4 hoặc 2.7, bạn vẫn nên sử dụng '' python-home''. Tôi biết không có vấn đề với cách sử dụng không ưa thích của thiết lập '' python-path'', nhưng nó chỉ đơn giản là không phải những gì bạn nên làm. Tùy chọn '' python-home'' là cách tốt nhất để thiết lập vị trí của môi trường ảo trong một thời gian dài. Vì vậy, lâu mà ngay cả bản phân phối Linux với các phiên bản mod_wsgi cổ vẫn nên hoạt động. Đây là trường hợp ngay cả khi tài liệu có thể vẫn chưa được cập nhật. :-) –

+0

@ graham-dumpleton Cảm ơn lời khuyên của bạn. Nhưng trong trường hợp của tôi, tôi đang sử dụng python 3.4, và thiết lập là cách "python-home" như bạn đã đề cập. Tuy nhiên, trang web của tôi không thể truy cập được, vì Apache tiếp tục gửi lỗi "Lỗi nhập: Không có mô đun nào có tên 'trang web'". Miễn là tôi định cấu hình nó thành "cách không ưa thích", sử dụng ":" như người hỏi đã làm, vấn đề này đã được giải quyết. Và có, đối với Python 3.5, bạn nên sử dụng "python-home" cách, hoặc [ImportError: Không có mô-đun tên 'django'] vấn đề sẽ tăng lên. – Valorad

+0

Điều đó có nghĩa là mod_wsgi của bạn không thực sự được biên dịch cho phiên bản Python đó. Bạn không thể buộc mod_wsgi sử dụng một phiên bản Python khác với phiên bản được biên dịch. Một trong những vấn đề với việc sử dụng 'python-path'' là nó không hiển thị tốt khi bạn đang làm điều sai trái và cố gắng ép mod_wsgi sử dụng môi trường ảo cho một phiên bản Python khác với mod_wsgi được biên dịch. Khi sử dụng '' python-home'', thay vào đó nó sẽ thất bại một cách chính xác, cho bạn biết rằng bạn đang làm điều gì sai. –

Các vấn đề liên quan