首页 > 解决方案 > 如何停止在 django 中拥有匿名用户

问题描述

所以我有一个 django 项目,并且有一个视图(主视图)显示关注用户的帖子,并且需要对用户进行身份验证,如果没有用户登录,则代码返回 'AnonimousUser' 不是可迭代错误,如果此人在主视图上,我希望我的代码将匿名用户重定向到登录页面。经过一番调查,我意识到这可以通过自定义中间件来完成,但我不知道该怎么做,所以目前中间件只会在用户登录或匿名时打印。我能做些什么来完成这个中间件并摆脱那个 Anoniomus User 错误?

中间件.py

class LoginRequiredMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
    def __call__(self, request):
        response = self.get_response(request)
        return response
    def process_view(self, request, view_func, view_args, view_kwargs):
        if(request.user.is_authenticated):
            print(Authenticated")
        else:
            print("Anonimous user")

视图.py

def home(request):
    user = Following.objects.get(user=request.user)
    followed_users = [i for i in user.followed.all()]
    followed_users.append(request.user)

    contents = Post.objects.filter(user__in = followed_users)

    context = {
        "contents": contents,
    }
    print("nice")
    return render(request, 'home.html', context)

网址.py

urlpatterns = [
    path('', views.home, name='home'),
    path('login', views.login, name='login'),
    path('register', views.register, name='register'),
    path('logout', views.logout, name='logout'),
    path('<username>/', views.profile, name='profile'),
]

如果您有任何问题或需要查看更多代码,请告诉我;)

标签: pythondjangodjango-modelsdjango-viewsmiddleware

解决方案


无需编写自定义中间件。

您可以像这样限制视图中的匿名用户

def home(request):
    if not request.user.is_authenticated:
        return redirect  ('your_login_url')
    user = Following.objects.get(user=request.user)
    followed_users = [i for i in user.followed.all()]
    followed_users.append(request.user)

或者你可以使用login_required装饰器

from django.contrib.auth.decorators import login_required

@login_required(login_url='your_login_url')
def home(request):
    user = Following.objects.get(user=request.user)
    followed_users = [i for i in user.followed.all()]
    followed_users.append(request.user)

推荐阅读