Django 2,Python3.4无法解码urlsafe_base64_decode(uidb64)

2024-05-23 15:06:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过电子邮件激活用户, 电子邮件工作,编码工作,我使用了django1.11的方法,这是成功的。在

在django1.11中,以下代码成功地解码为28,其中uidb64=b'Mjg'

force_text(urlsafe_base64_decode(uidb64))

在django2(2,0,0,'final',0)中,上述代码解码不起作用并导致错误

^{pr2}$

我也发表了我的看法以防万一

from django.utils.encoding import force_bytes, force_text
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode    
def signup(request):
    if request.method == 'POST':
        form = SignUpForm(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            user.is_active = False
            user.save()
            # auth_login(request, user)
            message = render_to_string('user_activate_email.html', {
                'user': user,
                'domain': Site.objects.get_current().domain,
                'uidb64': urlsafe_base64_encode(force_bytes(user.pk)),
                'token': account_activation_token.make_token(user),
            })
            mail_subject = 'Activate your blog account.'
            to_email = form.cleaned_data.get('email')
            email = EmailMessage(mail_subject, message, to=[to_email])
            email.send()
            messages.info(
                request, 'Activation link has been sent to your email!')
            # return redirect('home')
            return render(request, 'index.html')
    else:
        form = SignUpForm()
        return render(request, 'user_action.html', {'form': form})


def activate(request, uidb64, token):
    try:
        import pdb;
        pdb.set_trace()
        uid = urlsafe_base64_decode(uidb64).decode()
        user = User.objects.get(pk=uid)
    except(TypeError, ValueError, OverflowError):
        user = None
    if user is not None and account_activation_token.check_token(user, token):

        user.refresh_from_db()
        user.is_active = True

        user.save()
        auth_login(request, user)
        messages.info(request, 'Your account has been activated successfully!')
        return redirect('events:home')
    else:
        messages.info(
            request, 'Activation link is invalid or has been activated')
        return redirect('events:home')

附言:这只是我在CBV工作之前的一个试验。在

编辑:包括回溯

System check identified no issues (0 silenced).
December 15, 2017 - 05:51:01
Django version 2.0, using settings 'event_management.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
> /home/vipinmohan/django2-0/event/event_management/users/views.py(88)activate()
-> uid = urlsafe_base64_decode(uidb64).decode()
(Pdb) n
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcc in position 1: invalid continuation byte
> /home/vipinmohan/django2-0/event/event_management/users/views.py(88)activate()
-> uid = urlsafe_base64_decode(uidb64).decode()
(Pdb) n
> /home/vipinmohan/django2-0/event/event_management/users/views.py(90)activate()
-> except(TypeError, ValueError, OverflowError):
(Pdb) n
> /home/vipinmohan/django2-0/event/event_management/users/views.py(91)activate()
-> user = None
(Pdb) 

Tags: toformtokeneventhomeisemailrequest
1条回答
网友
1楼 · 发布于 2024-05-23 15:06:39

好吧。经过一个小时的搜索(仍然是pythondjango的初学者),发布说明中指出了一个相关的变化,对于新手来说,其定义并不难。 https://docs.djangoproject.com/en/2.0/releases/2.0/#removed-support-for-bytestrings-in-some-places

To support native Python 2 strings, older Django versions had to accept both bytestrings and unicode strings. Now that Python 2 support is dropped, bytestrings should only be encountered around input/output boundaries (handling of binary fields or HTTP streams, for example). You might have to update your code to limit bytestring usage to a minimum, as Django no longer accepts bytestrings in certain code paths.

For example, reverse() now uses str() instead of force_text() to coerce the args and kwargs it receives, prior to their placement in the URL. For bytestrings, this creates a string with an undesired b prefix as well as additional quotes (str(b'foo') is "b'foo'"). To adapt, call decode() on the bytestring before passing it to reverse().

由于完全无法理解它的含义,我不得不深入研究实际的django核心代码。在

所以从django1.11到2.0,编码变化如下

'uid': urlsafe_base64_encode(force_bytes(user.pk)),

^{pr2}$

从中解码

uid = force_text(urlsafe_base64_decode(uidb64))

 uid = urlsafe_base64_decode(uidb64).decode()

就这样。希望这对某人有帮助。在

**********编辑****************

从Django 2.2起

django.utils.http.urlsafe_base64_encode()现在返回字符串而不是bytestring。在

并且django.utils.http.urlsafe_base64_decode()可能不再通过bytestring传递。在

感谢希尔马克指出这一点

相关问题 更多 >