django授权

django授权,django,authentication,Django,Authentication,需要授权。已经阅读了几篇文章,阅读了所有内置机制,接受它并付诸实践。他开始做这件事 注册采用模块django注册,自己编写登录,使用libdjango.contrib.auth。如下所示:我在登录页面登录,看起来一切正常,但当我转到另一个页面时,授权奇迹般地消失了。据我所知,授权并没有写入会话,我只在登录页面获得授权 我做了以下工作: 在登录页面上授权 将整个用户对象记录到会话 在每个页面上,当页面加载时,我检查的第一件事是会话数据中是否有User,如果有,从那里读取 源代码如下所示: def

需要授权。已经阅读了几篇文章,阅读了所有内置机制,接受它并付诸实践。他开始做这件事

注册采用模块django注册,自己编写登录,使用lib
django.contrib.auth
。如下所示:我在登录页面登录,看起来一切正常,但当我转到另一个页面时,授权奇迹般地消失了。据我所知,授权并没有写入会话,我只在登录页面获得授权

我做了以下工作:

  • 在登录页面上授权
  • 将整个
    用户
    对象记录到
    会话
  • 在每个页面上,当页面加载时,我检查的第一件事是会话数据中是否有
    User
    ,如果有,从那里读取
  • 源代码如下所示:

    def login_user(request):
    state = "Please log in below..."
    username = password = ''
    if request.POST:
        username = request.POST.get('username')
        password = request.POST.get('password')
    
        user = authenticate(username=username, password=password)
        if user is not None:
            if user.is_active:
                login(request, user)
                state = "You're successfully logged in!"
            else:
                state = "Your account is not active, please contact the site admin."
        else:
            state = "Your username and/or password were incorrect."
        request.session['user'] = user
        return render(request,'auth.html',{'state':state, 'username': username, 'info':'info'})
    
    以及我从
    会话
    中阅读的页面:

    @csrf_protect
    def home(request):
        if "user" in request.session:
            user = request.session['user']
        else:
            user = None
        return render_to_response('home.html', {'user_name' : user}, context_instance = RequestContext(request))
    

    但我认为,这是一种非常愚蠢的方式。你能建议一个更合适的方法吗?

    我真的不确定你想要实现什么。用户登录后,您可以访问
    request.user.is\u authenticated()
    以检查视图中是否有经过身份验证的用户,或访问用户本身的
    request.user

    您不需要将用户添加到会话中;这是由身份验证中间件自动完成的

    您也不需要手动检查用户;使用

    结合这一点,您的登录视图将变成:

    def login_user(request):
        state = "Please log in below..."
        username = password = ''
        if request.POST:
            username = request.POST.get('username')
            password = request.POST.get('password')
        else:
            return redirect('login/')
    
        user = authenticate(username=username, password=password)
        if user is not None:
            if user.is_active:
                login(request, user)
                state = "You're successfully logged in!"
            else:
                state = "Your account is not active, please contact the site admin."
        else:
            state = "Your username and/or password were incorrect."
        return render(request,'auth.html',{'state':state, 'info':'info'})
    
    在你的其他观点中:

    from django.contrib.auth.decorators import login_required
    from django.shortcuts import render
    
    @csrf_protect
    @login_required
    def home(request):
        return render(request, 'home.html')
    
    在模板中(从中):

    {%if user.u经过身份验证%}
    欢迎,{{user.username}}。感谢您登录

    {%else%} 欢迎新用户。请登录

    {%endif%}
    {% if user.is_authenticated %}
        <p>Welcome, {{ user.username }}. Thanks for logging in.</p>
    {% else %}
        <p>Welcome, new user. Please log in.</p>
    {% endif %}