Как просмотреть страницу только в том случае, если пользователь сначала перешел на другую страницу?

что я хочу сделать, когда пользователь хочет получить доступ к update и delete View он должен подтвердить свою личность, передав свой правильный пароль, если он правильный, то он откроет представления, если нет, то нет. но моя проблема в том, как узнать, что пользователь подтвердил свою личность в update и delete views

Урлы:

app_name = "users"

urlpatterns = [
    path("login/", UsersLoginView.as_view(), name="login"),
    path("logout/", UserLogoutView.as_view(), name="logout"),
    path("register/", UserRegisterView.as_view(), name="register"),
    path("<str:username>/", UserAccountDetailView.as_view(), name="account"),
    path(
        "<str:username>/verify/edit", UserAccountEditView.as_view(), name="verify-edit"
    ),
    path(
        "<str:username>/verify/delete",
        UserAccountEditView.as_view(),
        name="verify-delete",
    ),
    path("<str:username>/edit/", UserAccountEditView.as_view(), name="edit"),
    path("<str:username>/delete/", UserAccountDeleteView.as_view(), name="delete"),
]

миксины:

from django.contrib.auth.mixins import UserPassesTestMixin, LoginRequiredMixin
from django.http import Http404
from django.contrib.auth import get_user_model
from django.views.generic import FormView
from django.urls import reverse_lazy
from django.contrib import messages
from django.shortcuts import redirect


# Local Imports
from . import forms


User = get_user_model()


class UserPassesHimselfMixin(LoginRequiredMixin, UserPassesTestMixin):
    """Test if the User who Sent the Reqeust he is the Logged in User"""

    def test_func(self):
        return self.request.user == self.get_object()

    def get_object(self, queryset=None):
        username = self.kwargs.get("username")
        qs = User.objects.filter(username=username)
        if qs.exists():
            return qs.first()
        else:
            raise Http404("User Not Found")


class VerifyUserIdentity(UserPassesHimselfMixin, FormView):
    """Verify User Identity By Form and Redirect to another Page
    - provide Form that has ```verify()``` mehtod that return bool value
    - else Raise attribute error
    - Provide Success URL"""

    template_name = "users/verify_identity.html"
    form_class = forms.VerifyUserIdentityForm
    success_url = None
    if_verified_msg = "Your Identity is Verified Successfully"
    not_verified_msg = "Your Identity is not Verified"
    invalid_form_message = "Please Enter Right Data"
    context_object_name = "form"


    def check_form_valid(self, form):
        """Check if the Form is has verfiy() method"""
        if not hasattr(form, "verify"):
            raise AttributeError("Form Class must have a verify() method")

    def form_valid(self, form: forms.VerifyUserIdentityForm):
        """Verify User Identity and Redirect to another Page"""
        if self.check_form_valid(form):
            verified = form.verify()
            if verified:
                messages.success(self.request, self.if_verified_msg)
                return redirect(self.success_url)
            else:
                messages.error(self.request, self.not_verified_msg)
                return self.get(self.request)

    def form_invalid(self, form):
        messages.error(self.request, self.invalid_form_message)
        return self.get(self.request)

просмотров:


class UserVerifyIdentityViewEdit(mixins.VerifyUserIdentity):
    template_name = "users/verify_identity.html"
    success_url = reverse_lazy("users:edit")
    if_verified_msg = "Your Identity is Verified"
    if_not_verified_msg = "Your Identity is Not Verified , Please Enter Right Password"

class UserVerifyIdentityViewDelete(mixins.VerifyUserIdentity):
    template_name = "users/verify_identity.html"
    success_url = reverse_lazy("users:delete")
    if_verified_msg = "Your Identity is Verified"
    if_not_verified_msg = "Your Identity is Not Verified , Please Enter Right Password"


class UserAccountEditView(mixins.UserPassesHimselfMixin, UpdateView):
    template_name = "users/edit.html"
    model = User
    context_object_name = "form"
    success_url = reverse_lazy("users:account")
    form_class = forms.UserEditAllDataForm

    def form_invalid(self, form):
        messages.error(self.request, "Please Enter Valid Data")
        return super(UpdateView, self).form_invalid(form)

class UserAccountDeleteView(mixins.UserPassesHimselfMixin, DeleteView):
    template_name = "users/delete.html"
    model = User
    success_url = reverse_lazy("home")
    context_object_name = "user"

если я сначала перехожу к проверке... это работает, и если все правильно, то отображается следующая страница, но когда я перехожу непосредственно к удалению или редактированию, это тоже работает... это должно перенаправлять пользователя на страницу проверки. Я думаю о

  • генерируем токен и храним его в базе данных в течение нескольких минут, проверяем, есть ли у пользователя токен в URL, когда он переходит к delete и update, он будет работать, иначе Нет
  • .
  1. но я не знаю, является ли это лучшей практикой, каковы ваши решения?
  2. и если это хорошо, то как удалить токен из БД через несколько минут?
Вернуться на верх