我有一个 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 的值。
答案1
你能用不同的方法吗?不用使用两个不同的设置文件,你可以检查每个请求是否使用 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/