我正在使用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>
用于维护会话的代码
@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
答案 0 :(得分:1)
这与django无关。当前,浏览器对于使框架/嵌入式设备访问Cookie充满偏执,即使它们是Cookie的来源。此外,许多用户还阻止了第三方cookie(通常包括框架cookie)或所有cookie。您可以将会话ID嵌入this answer suggests作为框架ID,其中会话ID由Django模板或客户端javascript 在包含框架的页面上生成(完全随机或从cookie中获取), / em>可能有权访问cookie。
您可能还想考虑完全放弃嵌入/框架,而采用django include块,该块将聊天内容窗口作为div或类似内容插入包含页面,因此可以更好地访问cookie或其他会话变量。在这种情况下,我将javascript和html分开,并将js脚本标签放在头部。
作为最后一击,您可以使用客户端的公共ip和用户代理以及包含页面的URI(对于模板)的组合来替换对cookie的依赖。
编辑关于安全性:(在@EthanKeller发表评论之后)
浏览器试图保护框架免受主要内容的影响,反之亦然。这都取决于是否包含任何敏感信息。如果是这样,那么我建议通过将框架放在其自己的窗口/选项卡中(可能通过弹出调用)将它们分开。但是,对于聊天机器人,我怀疑是否有这么敏感的东西。经销商的选择。
答案 1 :(得分:1)
要允许来自iframe的cookie,必须使用SameSite=None
和Secure
选项设置cookie。
Set-Cookie: session=your_session; SameSite=None; Secure
来源:https://medium.com/trabe/cookies-and-iframes-f7cca58b3b9e
要在Django上执行此操作,您必须更新以下设置:
SESSION_COOKIE_SAMESITE = 'None' # As a string
SESSION_COOKIE_SECURE = True
不幸的是,'None'
的{{1}}值仅在Django 3.1之后可用,并且有no plan to backport it in 3.0 and 2.2。
还请注意,您的网站必须通过HTTPS进行服务。