Обслуживание статических файлов с Apache и Mod_wsgi без изменения конфигурации Apache? - PullRequest
1 голос
/ 20 октября 2010

У меня есть приложение Django, и я использую хостинг на общем сервере, поэтому я не могу изменить конфигурационные файлы apache.Единственное, что я могу изменить, - это файл .htaccess в моем приложении.У меня также есть стандартный файл Python django.wsgi в качестве точки входа.

В среде разработчиков я использую Django для обслуживания статических файлов, но это не рекомендуется в официальной документации, говоря, что вы должнысделайте это, используя вместо этого веб-сервер.

Есть ли способ обслуживания статических файлов через apache без доступа к конфигурации Apache, изменяя только файлы .htaccess или django.wsgi ??

Ответы [ 2 ]

2 голосов
/ 20 октября 2010

Первым шагом является добавление

AddHandler wsgi-script .wsgi

в ваш файл .htaccess, и ничто иное не устанавливает wsgi в качестве обработчика.Это приведет к тому, что запросы к django.wsgi и django.wsgi / что угодно перейдут в ваше приложение django.

Чтобы часть django.wsgi в URL исчезла, вам необходимо использовать mod_rewrite.Надеюсь, на вашем хосте это включено.Примером является

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /django.wsgi/$1 [QSA,PT,L]

, который будет обслуживать файл, если URL соответствует файлу, или будет обслуживаться django, если это не так.Другим вариантом будет

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !^/?static/
RewriteRule ^(.*)$ /django.wsgi/$1 [QSA,PT,L]

, чтобы запросы / static / * отправлялись к самому файлу, а все остальное проходило через django.

Тогда вам нужно будет скрыть django.wsgi изсгенерированные URL.Это можно сделать с помощью подобного фрагмента в вашем django.wsgi

def _application(environ, start_response):
    # The original application.
    ...

import posixpath

def application(environ, start_response):
    # Wrapper to set SCRIPT_NAME to actual mount point.
    environ['SCRIPT_NAME'] = posixpath.dirname(environ['SCRIPT_NAME'])
    if environ['SCRIPT_NAME'] == '/':
        environ['SCRIPT_NAME'] = ''
    return _application(environ, start_response)

Если это не совсем правильно, то обязательно обратитесь к http://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines. Я потянул большую частьподробности ответа оттуда, но только шаг за шагом собраны правильные части.

1 голос
/ 20 октября 2010

Обслуживание статических файлов с другого виртуального хоста.

...