kd0*_*001 9 django iframe django-sessions
我正在使用django创建对话式聊天机器人。为了保持chatbot中的聊天流程,我使用django会话。但是,当我在iframe中使用聊天机器人的链接时,它不存储任何会话,并且流量中断。我想要一个即使在iframe中也有助于维护会话的函数。
对于Iframe
<html>
<head></head>
<body>
<embed style=" width: 384px; height: 525px; margin-right: 0px !important; bottom: 0px; float: right; position: absolute; bottom: 30px; width: 100%;" frameborder="0" scrolling="no" id="iframe" src="http://*********.com/********/*******.html">
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
代码用于维护会话
@staticmethod
def extract_data(request, input_data):
from chat import validations
if 'city' not in request.session:
response_data = {'extra': {}, 'data': {}}
response_data['extra']['statement'] = 'Select Car Model which you like to rent?'
response_data['extra']['type'] = 'carmodel'
response_data['data'] = Cars.city_check(request,response_data, input_data)
elif 'veh_name' not in request.session:
response_data = Cars.veh_name_check(request, input_data)
elif 'days' not in request.session:
response_data = validations.days_check(request, input_data)
elif 'phone' not in request.session:
response_data = validations.phone_check(request, input_data)
elif 'email' not in request.session:
response_data = validations.mail_check(request, input_data)
elif 'name' not in request.session:
response_data = validations.name_check(request, input_data, 'Car')
return response_data
Run Code Online (Sandbox Code Playgroud)
这个和django关系不大。浏览器目前对允许框架/嵌入访问 cookie 持偏执态度,即使它们是 cookie 的来源。此外,许多用户阻止第三方cookie(通常包括框架cookie)或所有cookie。您可以将会话 ID 嵌入到框架源中,正如这个答案所建议的那样,会话 ID 是由 django 模板或客户端 JavaScript在包含可能有权访问该框架的页面上生成的(完全随机或从 cookie)曲奇饼。
您可能还想考虑完全放弃嵌入/框架,转而使用 django include 块,它将聊天内容窗口作为 div 或类似内容插入到包含页面中,从而更好地访问 cookie 或其他会话变量。在这种情况下,我会将 javascript 与 html 分开,并将 js 脚本标记放在 head 中。
作为最后一搏,您可以用客户端的公共 IP 和用户代理以及包含页面 URI(在模板的情况下)的组合来替换对 Cookie 的依赖。
编辑关于安全性:(在 @EthanKeller 发表评论后)
浏览器试图保护框架免受主要内容的影响,反之亦然。这完全取决于其中一个是否包含任何敏感信息。如果是这样,那么我建议通过将框架放在它自己的窗口/选项卡中(可能通过弹出调用)来分隔它们。然而,就聊天机器人而言,我怀疑是否有那么敏感的事情。经销商的选择。
要允许来自 iframe 的 cookie,您必须使用SameSite=None和Secure选项来设置 cookie。
Set-Cookie: session=your_session; SameSite=None; Secure
Run Code Online (Sandbox Code Playgroud)
来源:https ://medium.com/trabe/cookies-and-iframes-f7cca58b3b9e
要使用 Django 执行此操作,您必须更新以下设置:
Set-Cookie: session=your_session; SameSite=None; Secure
Run Code Online (Sandbox Code Playgroud)
不幸的是,'None'valueSESSION_COOKIE_SAMESITE仅自 Django 3.1 起可用,并且没有计划在 3.0 和 2.2 中向后移植它。
另请注意,您的网站必须通过 HTTPS 提供服务。
| 归档时间: |
|
| 查看次数: |
232 次 |
| 最近记录: |