Как я могу защитить некоторые конечные точки от прямого доступа к ним пользователей в django?

Имеется URL с конечной точкой, названной 'otp/', я не хочу, чтобы пользователь обращался к этой конечной точке напрямую, я хочу, чтобы они были направлены моим кодом (когда это необходимо)

Как я могу это сделать?

вот мой код

class OTPView(View):

    def get(self, request, *args, **kwargs):
        otp_form = OTP_Form()
        return render(request, 'otp.html', {'otp_form': otp_form})

    def post(self, request, *args, **kwargs):
        try:
            otp = request.session.get('otp')
            first_name = request.session.get('first_name')
            last_name = request.session.get('last_name')
            password = request.session.get('password')
            phone = request.session.get('phone')
            otp_form = OTP_Form(request.POST)
            if otp_form.is_valid():
                get_otp = otp_form.cleaned_data['otp']
                if get_otp == otp:
                    user = MyUser.objects.create_user(
                        phone=phone, password=password, first_name=first_name, last_name=last_name)
                    user.save()
                    otp_entry = OTP.objects.create(user_id=user, otp=otp)
                    otp_entry.save()
                    delete_session(request)
                    messages.success(
                        request, 'Your account has been created')
                    return redirect('login')
                else:
                    messages.error(request, 'Incorrect OTP')
                    return redirect('otp')
            else:
                messages.error(request, 'Please enter the OTP again')
                return redirect('otp')
        except:
            messages.error(request, 'Please try signing up again')
            return redirect('signup')

urls.py

path('otp/', OTPView.as_view(), name='otp'),

Я хочу, чтобы к этой конечной точке пользователь получил доступ сразу после регистрации

Пожалуйста, посоветуйте мне что-нибудь

Сама идея звучит странно, это не то, как должен работать HTTP. Вы можете ограничивать представления на основе разрешений, но не на основе состояния. Рассмотрите возможность поместить такую логику в функцию вместо представления или сделать проверку состояния внутри представления на основе некоторой информации (например, вы можете хранить данные в сессии или cookie и проверять их в представлении).

Если вы не хотите, чтобы это было API, и хотите обрабатывать это только внутри кода, то нет необходимости регистрировать эту функцию в каком-либо маршрутном пути. Просто используйте ее как сигнал после регистрации пользователя.

Сигналы Django: https://docs.djangoproject.com/en/4.0/topics/signals/

post_save сигнал может быть полезен для вашего дела.

Есть простой способ сделать это, просто в методе get проверить referrer:

 def get(self, request, *args, **kwargs):
     if request.META['HTTP_REFERER'] != '/mylogin/':
         return HttpResponseForbidden()
     otp_form = OTP_Form()
     return render(request, 'otp.html', {'otp_form': otp_form})

Вам нужно проверить, является ли передающий url вашим регистрационным url

Вернуться на верх