Как я могу защитить некоторые конечные точки от прямого доступа к ним пользователей в 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