【问题标题】:HTTPS equivalent of Django's HttpResponseHTTPS 相当于 Django 的 HttpResponse
【发布时间】:2018-05-19 11:51:39
【问题描述】:

出于某种原因,我需要一个只返回一些文本的views.py。通常,我会为此使用HttpResponse("text")。但是,在这种情况下,我需要通过https 发送文本,以应对不可避免的混合内容警告。

通过 django(1.7.11) 通过 https 发送纯文本的最简单方法是什么?

【问题讨论】:

  • 这需要视图吗?我已经为像这样的谷歌验证 URL 做了这种事情: url(r'google\.html$', lambda r: HttpResponse("google-site-verification: google.html ", content_type="text/plain"))。不确定这是否适用于您的情况。
  • 这个问题似乎是基于一个基本的误解。 HttpResponse 没有指定响应是通过 HTTP 发送的;视图——实际上是 Django 本身——与与客户端的通信方法无关,这完全是服务器的责任。
  • @DanielRoseman 谢谢,确实有误会。这意味着最初的问题“通过 https 发送文本的最简单方法”只是 HttpResponse?

标签: django


【解决方案1】:

我也遇到过混合内容问题。根据我的经验,您根本无法使用HttpResponse 对象而不会遇到麻烦。不过,我从来没有完全确定过,最终找到了“绕过”它的方法。

我的解决方案是改用 JsonResponse 对象来返回 JSON 字符串,这是一种解决方法,视图返回如下内容:

mytext = 'stuff blablabla'
return JsonResponse({'response_text': mytext})

这非常容易解析,并且可以使用 HTTPS。 也许不是您想要的,但我希望它可以帮助您找到自己的方式。

【讨论】:

    【解决方案2】:

    Django 在httprequest.build_absolute_uri 的相关文档中写道:

    不鼓励在同一站点上混合使用 HTTP 和 HTTPS,因此 build_absolute_uri() 将始终生成一个绝对 URI,其中 当前请求具有相同的方案。如果您需要将用户重定向到 HTTPS,最好让您的 Web 服务器将所有 HTTP 流量重定向到 HTTPS。

    文档明确说明

    通信方式完全由服务器负责

    正如丹尼尔·罗斯曼所说。

    我的首选是在整个站点中使用force https,但也可以只针对特定页面使用。

    以上可以通过以下任一方式实现:

    还有其他-off the road-hackish 解决方案,例如snippet,可与urls.py 中的装饰器一起使用以强制https,或将某些网址重定向到https 的custom middleware

    【讨论】:

    • 我确实需要强制 https。装饰器应该可以工作,但确实看起来有点 hacky。
    • @MitchellvanZuylen 我已经修改了我的答案,以明确在您决定选择一个骇人听闻的解决方案之前有很多合法的解决方案。
    猜你喜欢
    • 2011-06-03
    • 2017-01-11
    • 2011-04-10
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多