zoukankan      html  css  js  c++  java
  • Django——用户认证和判断用户是否登录

    用户认证

    必须通过认证之后才能login(request,user)这样才能保存会话到request中,注销后会话结束

    注意

    • 自定义的用户登陆时只不止需要验证用户名和密码的需要写认证,就例如在线教育平台中需要通过邮箱或者用户名登录,自定义认证

    views.py

    from django.contrib.auth import authenticate,login,logout
    from django.contrib.auth.backends import ModelBackend
    from django.db.models import Q
    
    class CustomBackend(ModelBackend):
        def authenticate(self, username=None, password=None, **kwargs):
            try:
                user = UserProfile.objects.get(Q(username = username)|Q(email=username))
                if user.check_password(password):
                    return user
            except Exception as e:
                return None
    

    settings.py

    AUTHENTICATION_BACKENDS= (
        'users.views.CustomBackend',
    )
    

    还记得找回密码时说的用户未认证的错误吗,在后面的时候除了登录和判断用户是否登录其它的如添加数据的user用request.user就会出错哦

    • 自定义的用户登陆时只需要验证用户名和密码的不需要写认证

    ++登录++

    from django.contrib.auth import authenticate,login,logout
    
    def UserLogin(request):
    
        name = request.COOKIES.get('name')
        if name:
            return HttpResponseRedirect('/home')
    
        if request.method == 'POST':
            user_form = LoginForm(request.POST)
            if user_form.is_valid():
                username = user_form.cleaned_data.get('username')
                password = user_form.cleaned_data.get('password')
                # user = Profile.objects.filter(nick_name=username,password=password)
                # =================认证开始====================
                user = authenticate(username=username,password=password)
                # =================认证结束====================
                if user:
                 # =================登录====================
                    login(request,user)
                 #
                    response = HttpResponseRedirect('/home/')
                    response.set_cookie('name',username,60*60*24*1)
                    return response
                    # return render(request,'feedback.html')
                    # 这里直接写模版渲染,就不能设置cookie的过期时间了
        return render(request,'login.html')
    

    注销

    def UserLogout(request):
        logout(request)
        return HttpResponseRedirect('/home/')
    
    • 认证之后设置的会话过期时间会影响到登录的会话
    request.session.set_expiry(40)
    
    • 可以通过计算时间来解决结束部分会话

    用户登录之后才能进行一些操作

    一个简单原始的限制方法是检查 request.user.is_authenticated() ,然后重定向到登陆页面:

    作为一个快捷方式, 你可以使用便捷的 login_required 修饰符:

    views.py

    from django.contrib.auth.decorators import login_required
    # 需要登录之后才执行的函数上面可以加个@login_required
    @login_required
    def my_view(request):
      # ......
    

    settings.py 中需要指明装饰器的路径才能找到制定的登录函数

    LOGIN_URL='/login/'
    
  • 相关阅读:
    作为一个蒟蒻谈一点考试经验(总结)
    Codeforces Round #517 Div. 2/Div. 1
    Codeforces访问提速攻略(小技巧)
    基数排序模板(基数排序,C++模板)
    k短路模板(洛谷P2483 [SDOI2010]魔法猪学院)(k短路,最短路,左偏树,priority_queue)
    洛谷P4907【CYH-01】小奔的国庆练习赛 :$A$换$B$ $problem$(DFS,剪枝)
    BSGS及扩展BSGS总结(BSGS,map)
    FWT模板(洛谷P4717 【模板】快速沃尔什变换)(FWT)
    洛谷CF264D Colorful Stones(子序列匹配,思维)
    洛谷SP22343 NORMA2
  • 原文地址:https://www.cnblogs.com/NeedEnjoyLife/p/6842809.html
Copyright © 2011-2022 走看看