Как просмотреть страницу только в том случае, если пользователь сначала перешел на другую страницу?
что я хочу сделать, когда пользователь хочет получить доступ к 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, он будет работать, иначе Нет .
- но я не знаю, является ли это лучшей практикой, каковы ваши решения?
- и если это хорошо, то как удалить токен из БД через несколько минут?