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 仅适用于某些页面的主要内容,如果未能解决你的问题,请参考以下文章
CSS 字体仅适用于从相同基础扩展的一些 Django 模板
ValueError:set_wakeup_fd 仅适用于带有 Django 3.0.2 或 Flask 2.0.0 的 Python 3.8 上的 Windows 主线程