使用 WSGI 对 Django 站点的安全和非安全版本进行不同的设置

使用 WSGI 对 Django 站点的安全和非安全版本进行不同的设置

我有一个 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/

相关内容