Python 如何防止登录用户访问';登录';或';注册';Django版本1.9中的页面?

Python 如何防止登录用户访问';登录';或';注册';Django版本1.9中的页面?,python,django,Python,Django,我对Python很陌生 我的问题是,我想限制已经登录的用户访问登录和注册页面 本质上,我所寻找的是类似@login\u required decorator的东西,它允许未登录的用户访问这些页面 到目前为止,我已经 看看其他的问题,比如,我在这里尝试了这个解决方案,但它对我不起作用 我搜索了Django文档、Django女孩和其他提供学习Django教程的网站 以下是我的views.py,用于登录: def login_view(request): # Login View to begin

我对Python很陌生

我的问题是,我想限制已经登录的用户访问登录和注册页面

本质上,我所寻找的是类似@login\u required decorator的东西,它允许未登录的用户访问这些页面

到目前为止,我已经

  • 看看其他的问题,比如,我在这里尝试了这个解决方案,但它对我不起作用
  • 我搜索了Django文档、Django女孩和其他提供学习Django教程的网站
以下是我的views.py,用于登录:

def login_view(request): # Login View to begin user session
print(request.user.is_authenticated())
if request.method == 'POST':
    form = UserLogInForm(request.POST)
    if form.is_valid():
        username = form.cleaned_data.get('username')
        password = form.cleaned_data.get('password')
        user = authenticate(username=username, password=password)
        if user is not None:
                login(request, user)
                print(request.user.is_authenticated())
                return HttpResponseRedirect('/')
        else:
            form = UserLogInForm()
        return render(request, 'login.html', {'form': form})
else:
    form = UserLogInForm()
return render(request, 'login.html', {'form': form})
以及注册:

class signup_view(View):
    form_class = UserSignUpForm
    template_name = 'signup.html'
    # Blank form is requested
    def get(self, request):
        form = self.form_class(None)
        return render(request, self.template_name, {'form': form})
        # Form is filled in and posted to DB - Process the Data
    def post(self, request):
        form = self.form_class(request.POST)
        if form.is_valid():
            # Further checks before committing object to the DB
            # Cleaned Data
            first_name = form.cleaned_data['first_name']
            last_name = form.cleaned_data['last_name']
            email = form.cleaned_data['email']
            username = form.cleaned_data['username']
            password = form.cleaned_data['password']
            user = User.objects.create_user(first_name=first_name,
                                            last_name=last_name,
                                            email=email,
                                            username=username,
                                            password=password
             )
             user.set_password(password)
             user.save()

             user = authenticate(email=email, username=username, password=password)
            if user is not None:
                if user.is_active:
                    login(request, user)
                    return HttpResponseRedirect('/')

    return render(request, self.template_name, {'form': form})

如果有人知道任何解决方案,那就太棒了,谢谢。

因为您使用的是基于类的视图,所以您可以使用和在检查方法测试中确定用户是匿名的:

class signup_view(UserPassesTestMixin, View):
    ...
    def test_func(self):
        return self.request.user.is_anonymous()

您可以使用
@user\u passes\u test
装饰器对另一个视图执行类似的操作。

我想您可以添加如下中间件: 您的应用程序/中间件/用户限制\u中间件.py

这些文件应该是:

class UserRestrictionMiddleware:
    def process_request(self, request):
        if request.user.is_authenticated():
            request_path = request.path_info
            if request_path.startswith('/login/') or request_path.startswith('/register/')  :
                return HttpResponseRedirect('.... to whereever you want...')
将其添加到您的设置中。py的中间件类如下:
“您的应用程序.middleware.user\u restriction\u middleware.UserRestrictionMiddleware”,将此代码添加到POST请求表单之前

class login(request):
if request.user.is_authenticated:
    return redirect('app_name_space_name:your_url_name_to_send_authenticated_user_to')
#Your codes here

您可以重定向到站点的主页,而不是完全阻止访问。我认为从用户的角度来看,这会更直观。@SaketMehta最终到达你不想去的地方从来都不是直观的。至少注册一条消息通知用户。@Melvyn这是真的,我同意。@user\u passes\u test decorator适用于login\u视图,但我无法让userpassestimxin(test\u func)重定向到所需页面;知道如何选择页面重定向到的URL吗?您需要在类级别定义
login\u URL
,请参阅。