Назад | Перейти на главную страницу

Различные настройки для безопасных и незащищенных версий сайта Django с использованием WSGI

У меня есть веб-сайт Django, где некоторые URL-адреса должны обслуживаться через HTTPS, а некоторые - через обычное соединение.

Он работает на Apache и использует WSGI. Вот конфиг:

<VirtualHost example.org:80>
    ServerName example.org
    DocumentRoot /var/www/html/mysite

    WSGIDaemonProcess mysite
    WSGIProcessGroup mysite

    WSGIScriptAlias / /path/to/mysite/conferencemanager.wsgi    
</VirtualHost>

<VirtualHost *:443>
    ServerName example.org
    DocumentRoot /var/www/html/mysite

    WSGIProcessGroup mysite

    SSLEngine on
    SSLCertificateFile /etc/httpd/certs/aace.org.crt
    SSLCertificateKeyFile /etc/httpd/certs/aace.org.key
    SSLCertificateChainFile /etc/httpd/certs/gd_bundle.crt

    WSGIScriptAlias / /path/to/mysite/conferencemanager_secure.wsgi     
</VirtualHost>

Когда я перезапускаю сервер, появляется первый вызываемый сайт - https или http - для выбора того, какой псевдоним сценария WSGI будет использоваться.

Мне просто нужно несколько настроек для защищенного сервера, поэтому я использую другой сценарий WSGI. Кроме того, есть способ изменить настройки в файле settings.py в зависимости от того, является ли соединение безопасным или нет, это также будет работать.

Спасибо

Доработка:

Причина, по которой мне нужны другие настройки, заключается в том, что я использую медиа-сервер на незащищенном сайте:

MEDIA_URL = 'http://xmpl.org/media/'
STATIC_URL = 'http://xmpl.org/static/'

Однако для безопасной версии, а не для настройки другого SSL-сертификата только для моего носителя, я использую тот же сервер:

MEDIA_URL = '/media/'
STATIC_URL = '/static/'

Поэтому мне нужно, чтобы значения изменились на уровне настроек. Я полагаю, что при необходимости я могу написать процессор контекста, который переопределяет значения для STATIC_URL и MEDIA_URL, если сервер безопасен.

Могли бы вы использовать другой подход? Вместо того, чтобы использовать два разных файла настроек, вы можете проверять каждый запрос, чтобы узнать, был ли он сделан с помощью https или нет ...

def view(request, param)
    if request.is_secure():
        do_this()
    else:
        do_that()

https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.is_secure

Если переписать все ваши представления слишком сложно, вы, вероятно, могли бы создать класс промежуточного программного обеспечения, который применял бы какое-то состояние ко всем вашим представлениям - что-то вроде:

from django.conf import settings
class HttpsDetectingMiddleware(object):
    def process_request(self, request):
       if request.is_secure():
           settings.MY_CONFIG = 'secure'
        else:
            settings.MY_CONFIG = 'insecure'
        return request

а затем добавьте свое промежуточное ПО в settings.py ...

https://docs.djangoproject.com/en/dev/topics/http/middleware/