【发布时间】:2022-06-14 00:34:13
【问题描述】:
我想要做的是当用户想要访问 update 和 delete 视图时,他必须通过传递他的正确密码来验证他的身份,如果是正确的将打开其他的意见不会 但我的问题是如何知道用户是否在 update 和 delete 视图中验证了自己
网址:
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"
如果我先从验证开始 .. 它可以工作,如果正确,它会呈现下一页,但是当我直接进入删除或编辑视图时,它也可以工作.. 它应该将用户重定向到验证页面 我想
- 生成一个token并在数据库中保存几分钟,当用户去delete和update时检查URL中是否有token否则工作不
- 但我不知道您的解决方案是什么?
- 如果好的话,如何在几分钟后从数据库中删除令牌?
【问题讨论】:
-
UP,我需要Anwer
标签: python django django-views django-authentication