Как я могу отменить соответствие URL, используя TimestampSigner в Django? - PullRequest
0 голосов
/ 24 мая 2019

Чтобы зарегистрировать пользователей в моем веб-приложении Django, я создал функцию, которая отправляет криптографически подписанную ссылку на уже подтвержденные адреса электронной почты, которая позволяет им получить доступ к странице регистрации пользователя.Следующий шаг - убедиться, что срок действия ссылки истекает через определенное время, но это оказывается сложнее, чем ожидалось.

Из-за этого я использовал встроенную функцию Django Signer,и теперь идея состоит в том, чтобы преобразовать это в функцию TimestampSigner.Для этого я прочитал и следую: https://docs.djangoproject.com/en/2.2/topics/signing/#verifying-timestamped-values

Вот мой код:

в models.py:

class GenerateUserRegistration(models.Model):
    signer = TimestampSigner(sep='/', salt='users.GenerateUserRegistration')

    def get_registration_url(self, pk):
        signed_pk = self.signer.sign(pk)
        domain = Site.objects.get_current().domain
        path = str(reverse('register', kwargs={'signed_pk': signed_pk}))
        registration_url = 'http://{domain}{path}'.format(domain=domain, path=path)
        return registration_url

в views.py:

def register(request, signed_pk):
    try:
        pk = GenerateUserRegistration.signer.unsign(signed_pk, max_age=30)
        confirmed = Program.objects.get(id=pk)
    except (BadSignature, GenerateUserRegistration.DoesNotExist):
        raise Http404(signed_pk)

def generate_user_registration_email(request):
...
        UserGenerator = GenerateUserRegistration()
        user_registration_url = UserGenerator.get_registration_url(pk)
        send_mail('app specific data')
...        

в URL-адресе:

"NoReverseMatch at / admin / generate-user-registration Оборот для 'register' с аргументами ключевого слова '{' signature_pk ':' 1 / 1hUBvf / 3EiPZDorfNCqovGyDjoO - 9oyTQ '}' не найден.Попробован 1 шаблон (ов): ['register / (? P [0-9] + / [A-Za-z0-9 _ = -] +) / $'] "

Это приводитМне кажется, что я каким-то образом должен изменить URL-адрес соответствующим образом, чтобы приспособить TimestampSigner, но я не могу найти ничего в документации, ни где-либо еще, по этому поводу.Что нужно изменить там, чтобы это работало?

Заранее спасибо!

1 Ответ

0 голосов
/ 24 мая 2019

Регулярное выражение в вашем urlpatterns должно соответствовать формату подписанной строки.Как отмечено в документации , подписанная строка с меткой времени имеет формат, отличный от обычной строки со знаком;в частности, он «добавляет подписанную метку времени к значению».

Таким образом, вам нужно изменить шаблон URL, чтобы он соответствовал, а именно:

r'register/(?P<signed_pk>[0-9]+/[A-Za-z0-9_=-]+/[A-Za-z0-9_=-]+)/$'

Однако я предлагаю не использовать/ в качестве разделителя, поскольку этот символ имеет семантическое значение в URL.Используйте URL безопасный символ, такой как $.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...