如何停止在 django 中拥有匿名用户

How to stop having anonymous user in django

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

middleware.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")

views.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)

urls.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'),
]

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

无需编写自定义中间件。

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

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)</pre>

或者您可以使用 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)</pre>
		

嗯,上面的答案包含了你问题的两个解决方案,你也可以使用 django.contrib.auth.mixins,它们用于基于 Class 的视图 .文档链接是

1.https://docs.djangoproject.com/en/3.0/topics/class-based-views/mixins/ 2.https://docs.djangoproject.com/en/3.0/topics/auth/default/

一个可能的问题可能是您将登录模板表单的操作设置为重定向到某个页面,例如

因此,它从不验证登录视图以进行身份​​验证。如果是这样,请尝试设置登录表单的 action="" 并编写呈现 login.html 模板的登录视图。