【问题标题】:How to stop having anonymous user in django如何停止在 django 中拥有匿名用户
【发布时间】:2026-01-19 22:40:01
【问题描述】:

所以我有一个 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")

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

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

【问题讨论】:

标签: python django django-models django-views middleware


【解决方案1】:

无需编写自定义中间件。

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

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)

【讨论】:

  • 是的,这是最好的选择,因为您可以控制哪些视图需要身份验证,哪些不需要
  • 嘿,我有一个问题,如果登录视图在其他应用程序中,我该如何重定向?会是return redirect(my_app/login)吗?
  • return redirect('app_name:login_url_namr')
  • @JuanMartinZabala 请参阅docs 了解更多信息
  • 好的,谢谢!我会在 1 小时内尝试,我现在不在家。我会让你知道会发生什么;)
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】: