Cookie控制
一些司法管辖区要求在添加分析脚本和跟踪Cookie之前必须获得用户的同意。虽然可能最好完全不使用任何分析和跟踪,但在所有情况下这可能不可能或甚至不希望这样做。
存在许多向网站添加同意横幅的解决方案。其中一些横幅需要从外部服务器加载JavaScript和其他资产。这引起了一些问题,因为加载这些脚本也可能被视为跟踪。在本地实现一个Cookie控制面板肯定更安全。每次从零开始在每个网站上启动都会很无聊。
本指南解释了如何使用feincms3-cookiecontrol。
安装
安装软件包
venv/bin/pip install feincms3-cookiecontrol
将feincms3_cookiecontrol添加到INSTALLED_APPS
INSTALLED_APPS = [
# ...
"feincms3_cookiecontrol",
]
应用初始迁移
python manage.py migrate
将面板添加到模板中,例如在base.html的<body>元素末尾
<!doctype html>
<html>
...
<body>
...
{% load feincms3_cookiecontrol %}{% feincms3_cookiecontrol %}
</body>
</html>
现在您必须自己添加所有跟踪脚本。
面板的展示是一个固定在视口底部的横幅。一旦任何cookie已被接受(必需cookie必须接受,例如CSRF cookie),横幅将被一个按钮替代,该按钮允许再次显示控制面板。
自定义外观
控制面板的默认颜色可能不适合您的网站。最佳的自定义外观方法是设置一些CSS变量,例如
.f3cc {
--f3cc-background: #e9e9e9;
--f3cc-foreground: #000000;
--f3cc-button-background: #cbcbcb;
--f3cc-accept-background: #90f690;
--f3cc-button-foreground: #cbcbcb;
--f3cc-accept-foreground: #cbcbcb;
}
如果设置了单个变量,建议设置所有变量;例外的是--f3cc-button-foreground,其默认值为--f3cc-foreground,以及--f3cc-accept-foreground,其默认值为--f3cc-button-foreground。
隐藏修改按钮
您可能希望在某些页面上隐藏修改同意的按钮,例如除了隐私政策外的所有页面。以下是一个好方法。
假设您正在使用feincms3模板和区域指南中描述的页面类型。假设您的隐私政策页面使用指南中描述的标准页面类型
class Page(AbstractPage, PageTypeMixin):
TYPES = [
TemplateType(
key="standard",
title=_("standard"),
template_name="pages/standard.html",
regions=[
Region(key="main", title=_("Main")),
],
),
]
我们将添加一个额外的页面类型,可以用作标记。由于我们使用feincms3应用程序,如果您还没有这样做,请务必阅读feincms3应用程序的介绍。您还可能想查看feincms3根passthru参考。
class Page(AbstractPage, PageTypeMixin):
TYPES = [
TemplateType(
key="standard",
title=_("standard"),
template_name="pages/standard.html",
regions=[
Region(key="main", title=_("Main")),
],
),
ApplicationType(
key="privacy-policy",
title=_("privacy policy"),
urlconf="feincms3.root.passthru",
template_name="pages/standard.html",
regions=[
Region(key="main", title=_("Main")),
],
),
]
现在您可以扩展page_context辅助函数
from feincms3.root.passthru import reverse_passthru
def page_context(request, *, page=None):
...
context = {
...
}
if url := reverse_passthru("privacy-policy", fallback=None):
context["privacy_policy_url"] = request.build_absolute_uri(url)
return context
现在您可以在模板中使用这个额外的变量
<!doctype html>
<html>
...
<body>
...
{% load feincms3_cookiecontrol %}
{% feincms3_cookiecontrol privacy_policy_url=privacy_policy_url %}
</body>
</html>
前端代码将自动将隐私政策的链接添加到横幅内容中,并且仅在当前位置匹配隐私政策URL时显示修改按钮。
从不同站点使用面板
可以通过以下步骤将面板集成到另一个网站。
设置cookie的域名,以便cookie在子域名上可用(务必检查相关的指南,了解这样做可能存在的问题以及您必须遵守的限制)
COOKIECONTROL = {"domain": "example.com"}
添加视图并提供可选的隐私政策URL
from feincms3.root.passthru import reverse_passthru_lazy
from feincms3_cookiecontrol.views import inject
urlpatterns = [
# Base case
path("f3cc-inject.js", inject),
# Using reverse_passthru_lazy.
# NOTE! The inject view uses `request.build_absolute_uri` to
# complete the URL, you do not have to add the domain and
# protocol yourself here.
path(
"f3cc-inject.js",
inject,
{"privacy_policy_url": reverse_passthru_lazy("privacy-policy", fallback="/")},
),
]
嵌入脚本
<script async src="https://example.com/f3cc-inject.js"></script>
选择性地嵌入iframe或其他第三方脚本
如果用户不同意您的cookie政策,嵌入第三方脚本或iframe可能会违反数据保护法,因为个人数据在没有用户知道或同意的情况下被传输到第三方。一种方法是完全禁用第三方内容,或者选择性地要求用户同意特定提供者的数据政策。这可以通过“有意识的嵌入”功能完成。
在您的settings.py中扩展默认提供者
EMBED_PROVIDERS = {
"some-provider": {
"title": "Mailchimp",
"privacy_policy_url": "https://mailchimp.com/legal/privacy/",
},
}
将嵌入的代码用模板块embed包围
...
{% load feincms3_cookiecontrol %}
...
<div class="container">
{% wrap "mailchimp" %}
<script src="https://some-provider.com/example.js"></script>
{% endwrap %}
</div>
...
未同意您的通用cookie政策的用户现在将被要求允许嵌入特定提供商的内容。
您还可以包裹默认的嵌入内容插件渲染器,例如 feincms3.plugins.external 或 feincms3.embedding,但您必须明确指定提供商(如上例中的 {% wrap %} 模板标签所示)。
如果向网站动态添加包含此类嵌入片段的HTML,您必须自己调用 f3ccRenderEmbeds() JavaScript函数来嵌入用户已接受的第三方内容。
仅使用URL自动嵌入内容
feincms3_cookiecontrol.embedding 模块还提供了一个 embed 函数,您只能传递一个URL,您将返回包裹的嵌入代码或者什么都没有。您还可以指定自己的嵌入提供商;在这种情况下,您还应该在 EMBED_PROVIDERS 设置中添加一个 handler 键;该函数只接收URL,并返回嵌入HTML或 None 如果URL根本未使用该提供商。截至编写本文时,该模块支持嵌入YouTube和Vimeo URL。
您可以使用以下方式使用 embed 速记
# ...
from feincms3_cookiecontrol.embedding import embed
# ...
class EmbeddedVideo(plugins.external.External, PagePlugin):
# ...
def embedded_html(self):
return embed(self.url)
模板中也直接提供了相同的功能
...
{% load feincms3_cookiecontrol %}
{% embed plugin.url %}
...