2009-04-08 35 views
9

Tôi có một ứng dụng django sử dụng mod_python, cấu hình khá điển hình ngoại trừ các tệp phương tiện đang được phục vụ bởi thư mục 'tôi biết, không được khuyến nghị' trong thư mục gốc tài liệu. Tôi muốn thử nghiệm và có thể triển khai với mod_wsgi nhưng tôi không thể tìm ra cách để tạo ra một cái gì đó đơn giản để phục vụ các tập tin tĩnh. mod_python cho phép việc sử dụng các chỉ thị Apache như:Cung cấp các tệp tĩnh với mod_wsgi và Django

<Location '/'> 
    SetHandler MyApplication.xyz..... 
</Location> 

<Location '/media'> 
    SetHandler None 
</Location> 

Các django docs dường như để trỏ đến khối thứ hai ở trên là cách chính xác để tạo ra một ngoại lệ tương tự cho mod_wsgi, nhưng trong các thử nghiệm của tôi tất cả mọi thứ dưới gốc vẫn đang được gửi vào ứng dụng wsgi. Có cách nào tốt đặt một thư mục phương tiện truyền thông tĩnh với mod_wsgi, hoặc là những gì tôi đang cố gắng để cố ý không được hỗ trợ vì lý do kỹ thuật hấp dẫn? Các câu trả lời trỏ đến các cách tiếp cận hoàn toàn khác nhau đều được chào đón.

Trả lời

13

Tài liệu mod_wsgi giải thích cách thiết lập các tệp tĩnh xuất hiện tại URL bên dưới URL mà ứng dụng WSGI được gắn kết. Xem:

http://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines#Hosting_Of_Static_Files

Lưu ý rằng 'Options + ExecCGI' không cần khi sử dụng WSGIScriptAlias ​​chỉ thị để gắn kết các ứng dụng WSGI. Tùy chọn 'ExecCGI' chỉ được yêu cầu khi sử dụng AddHandler để gắn kết các ứng dụng dưới dạng tài nguyên.

+0

Graham Dumpleton! Cảm ơn bạn đã mod_wsgi! Trên thực tế tôi nghĩ rằng thứ tự là vấn đề ban đầu, tôi đã không sử dụng chỉ thị cgi. Module của bạn đã cho phép tôi thực hiện rất nhiều thứ, tôi đã thực sự phát triển một thói quen mod_wsgi kể từ khi đặt câu hỏi này. – unmounted

+1

Cảm ơn đôi vì tài liệu. Tài liệu hay nhất tôi đã xem trong một thời gian dài. Chúc mọi người hơn sẽ đọc chúng !!!! – htmldrum

17

Tôi chạy một tá trang web Django trên cùng một máy chủ và đây là cách tôi định cấu hình URL phương tiện.

Mỗi VirtualHost có cấu hình sau:

Alias /media /path/to/media/ 
<Directory /path/to/media> 
    Include /etc/apache2/vhosts.d/media.include 
</Directory> 

Bằng cách này tôi có thể thực hiện bất kỳ thay đổi để xử lý trong một tập tin phương tiện truyền thông.

Sau đó, tập tin media.include của tôi trông như thế này:

Order allow,deny 
Allow from all 
SetHandler None 
FileETag none 
Options FollowSymLinks 

<IfModule mod_expires.c> 
    ExpiresActive On 
    ExpiresByType image/gif "access plus 30 days" 
    ExpiresByType image/jpg "access plus 30 days" 
    ExpiresByType image/png "access plus 30 days" 
    ExpiresByType image/jpeg "access plus 30 days" 
    ExpiresByType text/css "access plus 30 days" 
    ExpiresByType application/x-javascript "modification plus 2 years" 
</IfModule> 

<IfModule mod_headers.c> 
    Header append Vary Accept-Encoding 
</IfModule> 

AddOutputFilterByType DEFLATE text/html text/css text/plain 

này đã làm việc rất tốt cho tôi, và nhận được một Một lớp từ YSlow (xem thêm Jeff Atwood on YSlow).

Cũng lưu ý, đối với các thư mục gốc tôi sử dụng cấu hình sau:

WSGIScriptAlias//path/to/app.wsgi 
<Directory /path/to> 
    Options +ExecCGI 
    Allow from all 
</Directory> 

... mà nên sau Alias ​​/ phương tiện truyền thông trong tập tin cấu hình của bạn (vì Apache nhìn vào các bí danh theo thứ tự)

+0

Đối với thư mục gốc của bạn: Đó là siêu vành đai và niềng răng, nhưng từ POV bảo mật, tôi sẽ đặt phần bên trong và di chuyển "Cho phép từ tất cả" vào đó. – Cheekysoft

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