【问题标题】:how to view page only if the user pass another page first?仅当用户先通过另一个页面时如何查看页面?
【发布时间】:2022-06-14 00:34:13
【问题描述】:

我想要做的是当用户想要访问 updatedelete 视图时,他必须通过传递他的正确密码来验证他的身份,如果是正确的将打开其他的意见不会 但我的问题是如何知道用户是否在 updatedelete 视图中验证了自己

网址:

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并在数据库中保存几分钟,当用户去deleteupdate时检查URL中是否有token否则工作不
  1. 但我不知道您的解决方案是什么?
  2. 如果好的话,如何在几分钟后从数据库中删除令牌?

【问题讨论】:

  • UP,我需要Anwer

标签: python django django-views django-authentication


猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-08
  • 2022-11-15
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
相关资源
最近更新 更多