Форматирование амперсанда добавляет неожиданные символы - PullRequest
0 голосов
/ 21 февраля 2019

Использование Djoser Я пытаюсь создать правильный URL для моего интерфейса.У меня должен быть амперсанд в строке URL-адреса, и Djoser должен отформатировать этот URL-адрес перед отправкой на мой веб-интерфейс.URL выглядит так:

https://localhost:4200/activate?id=MjA&token=540-cad5f834d5508ebdd78e

Но конечный результат, который я получаю, выглядит как note "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: Я попробовал этов Юпитере, там все работает нормально, я получаю правильный URL, когда я делаю это следующим образом:

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

enter image description here

Непосредственное добавление & возвращаетчтобы открыть тот же URL с 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 голосов
/ 21 февраля 2019

После некоторых обсуждений выясняется, что Djoser хочет отправить электронное письмо для активации, и содержимое генерируется из шаблона Django .Проблема в том, что Django по умолчанию выполняет HTML-экранирование, поэтому символ & преобразуется в HTML-сущность &amp;, что здесь не так.

Ответ заключается в том, чтобы пометить URLкак безопасный HTML, пропуская его через фильтр.Это фактически означает замену {{ url }} на {{ url|safe }}.Лучший способ сделать это - создать новый шаблон, который переопределит шаблон, предоставленный Djoser, и вставить необходимый контент.Этот шаблон должен находиться в области шаблонов проекта как «email / активации.html».В Django есть некоторая документация по , как это сделать тоже .

Как только шаблон работает правильно, тогда URL должен быть выдан напрямую, без экранирования.

...