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/'
原文地址:https://www.cnblogs.com/NeedEnjoyLife/p/6842809.html