格式化与号并添加意外字符

时间:2019-02-20 23:46:23

标签: python python-3.x djoser

使用Djoser我试图为前端生成正确的url。我必须在我的网址字符串中使用&号,并且Djoser会在将该网址发送到前端之前对其进行格式化。网址看起来像:

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}',因此,我必须在此字符串中编写解决方案。

注释2::我在木星中尝试过,一切正常,当我这样做时,我得到了正确的网址:

print("https://localhost:4200/activate?id={uid}\u0026token={token}".format(uid="MjA", token="540-cad5f834d5508ebdd78e"))

enter image description here

直接添加&会返回到与amp;后面的&相同的网址

更新 Djoser模板覆盖

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        ...
    },
]

enter image description here

1 个答案:

答案 0 :(得分:3)

经过一番来回讨论,事实证明Djoser想要​​发送激活电子邮件,并且内容是从a Django template生成的。问题是Django默认情况下会进行HTML转义,因此&字符将转换为HTML实体&amp;,这在这里是不需要的。

答案是通过通过过滤器将URL标记为HTML安全。这实际上意味着将{{ url }}替换为{{ url|safe }}。最好的方法是创建一个新模板,以覆盖Djoser提供的模板并放入所需的内容。该模板需要以“ email / activation.html”的形式驻留在项目模板区域中。 Django中也有how this is done上的一些文档。

一旦模板正常工作,则应直接发出url,且不要转义。