Django SSL 仅适用于某些页面

Posted

技术标签:

【中文标题】Django SSL 仅适用于某些页面【英文标题】:Django SSL for some pages only 【发布时间】:2014-01-11 15:06:50 【问题描述】:

我知道还有其他关于此的 Q/A,但它们太低级了。

我想知道在 django 站点上实现部分 SSL 的正确(安全、DRY、可维护)方式是什么。

我希望在帐户页面(登录、登录、...)和“应用程序页面”上使用 https,但在 http 中保留公共内容页面。

我对各种答案持开放态度,但请解释如下:“到处使用 https,它的优点 X、Y、Z 超过缺点 A、B、C” “你必须使用 2 个 cookie”

如果按照我说的去做不是一个坏主意,我特别想知道如何处理非安全页面上的安全 cookie(知道我想通过我的网站保持一致的体验,让用户保持登录状态) -in 等)。

【问题讨论】:

为什么您只想在某些页面上使用 SSL?你明白这比仅仅让一切在 HTTPS 上运行更费力吗? @YuvalAdam 是的,但是我有没有因为内容页面不在 HTTP 中而“失去”什么?我想要平衡利弊的观点。 我相信你必须像中间件一样定义一个 SSL REDIRECTION 函数并在你的 settings.py 中使用它,现在你的 WSGI 使用你的项目设置你可以在你的 apache default-ssl 文件中定义使用或激活 https 的位置。请记住,要让它起作用,您还必须为测试模式创建一个自签名证书。整个过程稍微长一点。 【参考方案1】:

当您需要一个需要在某些选定视图上应用的功能时,使用装饰器是您的最佳选择。另一方面,如果你想实现一些应该应用于所有请求的东西,那么我们应该使用中间件。

创建一个装饰器,它将传入的请求重定向到 https。

#decorators.py
from django.http import HttpResponseRedirect

def secure_required(view_func):
    def _wrapped_view_func(request, *args, **kwargs):
        if request and not request.is_secure():
            request_url = request.build_absolute_uri(request.get_full_path())
            secure_url = request_url.replace('http://', 'https://')
            return HttpResponseRedirect(secure_url)
        return view_func(request, *args, **kwargs)
   return _wrapped_view_func

在你的views.py中

from decorators import secure_required

@secure_required
def myViewFunction(request):
    ...

【讨论】:

_wrapped_view_func 在函数外返回错误!它没有任何效果

以上是关于Django SSL 仅适用于某些页面的主要内容,如果未能解决你的问题,请参考以下文章

Collectstatic仅适用于某些应用

CSS 字体仅适用于从相同基础扩展的一些 Django 模板

如何仅在某些情况下禁用 Django 的 csrf 保护?

ValueError:set_wakeup_fd 仅适用于带有 Django 3.0.2 或 Flask 2.0.0 的 Python 3.8 上的 Windows 主线程

使用带有永久页面访问令牌的 Instagram Graph Api 仅适用于某些帐户

页面刷新后在文本输入上保留文本仅适用于某些浏览器