python - 格式化&符号会添加意外字符
问题描述
使用Djoser我试图为我的前端生成正确的 url。我的 url 字符串中必须有与号,并且 Djoser 在将其发送到我的前端之前会格式化此 url。网址如下所示:
https://localhost:4200/activate?id=MjA&token=540-cad5f834d5508ebdd78e
但我得到的最终结果看起来像注释“amp;” & 之后:
http://localhost:4200/activate?id=MjE&token=541-c0437e0afd6261fd4833
我尝试了以下解决方案,但它们都不起作用(\u0026, {\u0026}, {\u0026:c}, &&)
:
print("https://localhost:4200/activate?id={uid}\u0026token={token}".format(uid="MjA", token="540-cad5f834d5508ebdd78e"))
print("https://localhost:4200/activate?id={uid}{\u0026}token={token}".format(uid="MjA", token="540-cad5f834d5508ebdd78e")) <-- returns KeyError: '&'
print("https://localhost:4200/activate?id={uid}{\u0026:c}token={token}".format(uid="MjA", token="540-cad5f834d5508ebdd78e")) <-- returns KeyError: '&'
注意:我不能直接format()
部分更改代码,这将由 Djoser 处理。我可以通过的部分实际上只是将字符串值分配给激活 url,就像那里一样:'ACTIVATION_URL': 'activate?id={uid}{\u0026:c}token={token}',
所以我必须在这个字符串中编写我的解决方案。
NOTE2:我在 jupiter 中尝试过,一切正常,当我这样做时,我得到了正确的 url:
print("https://localhost:4200/activate?id={uid}\u0026token={token}".format(uid="MjA", token="540-cad5f834d5508ebdd78e"))
直接添加&
返回到前端与amp;
后面相同的 url&
更新 Djoser 模板覆盖
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
...
},
]
解决方案
经过一番反复讨论,事实证明 Djoser 想要发送一封激活电子邮件,并且内容是从Django 模板生成的。问题是 Django 默认会进行 HTML 转义,因此&
字符被转换为 HTML 实体 , &
,这不是这里想要的。
答案是通过过滤器将 URL 标记为 HTML 安全的。这实际上意味着替换{{ url }}
为{{ url|safe }}
. 最好的方法是创建一个新模板来覆盖 Djoser 提供的模板并放入所需的内容。此模板需要作为“email/activation.html”驻留在项目模板区域中。Django 中也有一些关于如何完成此操作的文档。
一旦模板正常工作,那么应该直接发出 url 而没有转义。
推荐阅读
- javascript - 从另一个函数内部调用一个变量是不好的?
- node.js - 获取 Node 中 SQLServer DateTimeOffset 列的实际偏移量
- python - 如何仅从加载的图像的一部分制作 pygame 表面对象?
- python-3.x - 在 Python 中处理大数字和大数组时提高速度
- javascript - 无法在“AudioNode”上执行“connect”
- python - 在 Entry() 框中显示选定文件路径的问题 - Python Tkinter
- python - 在 Windows 10 上的 pycharm 中安装 scrapy 时出现未知错误
- react-native - 文本下推其他文本
- python - 连接 3 个数据框更改原始的列类型
- yocto - meta-openembedded 的 meta-oe 与 Poky 的 meta