У меня есть веб-сайт 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/