• DJANGO-天天生鲜项目从0到1-003-用户模块-登录


    Django自带认证系统

    1.authenticate(username=username, password=password)

    校验输入的用户密码是否正确时,可使用django自带的authenticate方法,若正确,则返回user对象,否则返回None

    from django.contrib.auth import authenticate
    user = authenticate(username=username, password=password)
    if not user:
      self.content['errmsg'] = '用户名或密码不正确!'
      return self.my_render(request, self.content)
    # 判断是否激活
    if user.is_active == 0:
      self.content['errmsg'] = '用户未激活!'

    注意:django2.0以后,若用户密码正确,但是用户未激活,则authenticate()也会返回None,需在settings中加上下面语句,则校验时不会限制必须激活

    AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.AllowAllUsersModelBackend']

    2.login(request, user)/logout(request, user)

    有些页面是需要用户登录后才能访问的,因此需要记录用户的登录状态

    from django.contrib.auth import login, logout
    #校验登录成功后
    login(request, user)

    该方法会把登录的session默认存储在数据表djangi_session中,session_key为服务器返回给浏览器的cookie,默认两周后过期

    注意:用户登录之后

    2.1 在view中可以直接通过request.user获取到登录的user对象,例:获取用户名request.user.username

    2.2 除此之外,django还会直接把登录的user对象传给模板文件(而不需要我们再手动传一遍),例:

    {% if user.is_authenticated %}
    <div class="login_btn fl">
        欢迎您:<em>{{ user.username }}</em>
        <span>|</span>
        <a href="{% url 'user:logout' %}">退出</a>
    </div>
    {% else %}
    <div class="login_btn fl">
        <a href="{% url 'user:login' %}">登录</a>
        <span>|</span>
        <a href="{% url 'user:register' %}">注册</a>
    </div>
    {% endif %}

    3.login_required装饰器和LoginRequiredMixin类

     有些页面登录后才能访问,因此进入页面时,view中首先要判断用户是否登录,若登录,则正常显示页面,若未登录,则一般重定向到登录页面,路径为settings.py中的设置LOGIN_URL

    判断是否登录的三种写法:

    3.1 原始方法 is_authenticated

    重定向时,路径为settings.LOGIN_URL拼上next参数(get方法)

    from django.conf import settings
    from django.shortcuts import redirect
    
    def my_view(request):
        if not request.user.is_authenticated:
            return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
        # ...

    3.2 装饰器 login_required,视图定义为def方法时使用

    其中两个参数都可以不写,直接使用默认值,redirect_field_name表示重定向的参数名称,默认为next,login_url表示重定向的地址,默认为setting.LOGIN_URL的值,而setting.LOGIN_URL的值默认为'/accounts/login/'

    from django.contrib.auth.decorators import login_required


    @login_required(redirect_field_name='next',login_url='/accounts/login/')
    def my_view(request):
      ...

    3.3 LoginRequiredMixin,视图定义为class类时(官网翻译为通用视图)使用

    在类视图中先继承LoginRequiredMixin类,下面可以重定义上述的两个参数,不定义则使用上述默认值

    from django.contrib.auth.mixins import LoginRequiredMixin
    
    class MyView(LoginRequiredMixin, View):
        login_url = '/login/'
        redirect_field_name = 'redirect_to'

    注意:在定义settings.LOGIN_URL(或login_url)时,一定要以反斜杠‘/’开头,这样重定向的地址才会在端口号后直接拼上login_url,否则重定向的地址为当前地址拼上login_url

    修改CACHES和SESSION的存储后端

    django-redis 基于 BSD 许可, 是一个使 Django 支持 Redis cache/session 后端的全功能组件.

    安装django-redis

    pip install django-redis

    修改caches缓存设置

    # django 缓存设置cache: 使用redis数据库当做缓存的存储位置

    CACHES = {
      "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
        "OPTIONS": {
          "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
      }
    }

    修改session会话设置:

    # django 会话设置session: 将session存储在缓存中(默认为数据表django_session中)
    # 配合上面将缓存存在redis中,即可将session存在redis中
    SESSION_ENGINE = "django.contrib.sessions.backends.cache"
    SESSION_CACHE_ALIAS = "default" 
  • 相关阅读:
    db.Exec和db.Query的区别
    golang两种get请求获取携带参数的方式
    gin实现中间件middleware
    gin操作session
    笔札-有触动的句子
    并发的基本概念
    售货员的难题
    传球游戏之最小总代价
    状压dp入门
    [COCI 2010] OGRADA
  • 原文地址:https://www.cnblogs.com/gcxblogs/p/12783571.html
Copyright © 2020-2023  润新知