• Django--登录


    一、基本知识
    Django 用户认证(Auth)组件一般用在用户的登录注册上。
    Django 用户认证(Auth)组件需要导入 auth 模块:
    # 认证模块
    from django.contrib import auth
    # 对应数据库
    from django.contrib.auth.models import User
     
    返回值是用户对象。
    创建用户对象的三种方法:
    • create():创建一个普通用户,密码是明文的。
    • create_user():创建一个普通用户,密码是密文的。
    • create_superuser():创建一个超级用户,密码是密文的,要多传一个邮箱 email 参数。
    例:
    from django.contrib.auth.models import User 
    User.objects.create(username='runboo',password='123')
     
    1.验证用户的用户名和密码使用 authenticate() 方法,从需要 auth_user 表中过滤出用户对象。
    当我们试图登陆一个从数据库中直接取出来不经过authenticate()的User对象时会报错!!!
    使用前要导入:
    from django.contrib import auth
     
    2.登陆使用 login(request,user) 方法。给验证成功的用户加 session,将 request.user 赋值为用户对象。
    使用前要导入:
    from django.contrib import auth
     
    3.注销用户使用 logout(request) 方法,需要清空 session 信息,将 request.user 赋值为匿名用户。
    使用前要导入:
    from django.contrib import auth
    例:
    def logout(request):
        ppp = auth.logout(request)
        print(ppp) # None
        return redirect("/login/")

    4.设置装饰器,给需要登录成功后才能访问的页面统一加装饰器。

    使用前要导入:
    from django.contrib.auth.decorators import login_required
    例:
    from django.contrib.auth.decorators import login_required 
    @login_required
    def index(request):
      return HttpResponse("index页面。。。")

    5.修改密码

    check_password(passwd)用户需要修改密码的时候,首先要让其输入原来的密码 ,如果给定的值通过了密码检查,返回 True
    ok = user.check_password('密码')
    set_password()修改密码
    user = User.objects.get(username='用户名')
    user.set_password(password='设置的密码')
    user.save()

    示例:

     @login_required
      def set_password(request):
         user = request.user
         err_msg = ''
          if request.method == 'POST':
             old_password = request.POST.get('old_password', '')
             new_password = request.POST.get('new_password', '')
             repeat_password = request.POST.get('repeat_password', '')
             # 检查旧密码是否正确
             if user.check_password(old_password):
                 if not new_password:
                     err_msg = '新密码不能为空'
                 elif new_password != repeat_password:
                     err_msg = '两次密码不一致'
                 else:
                     user.set_password(new_password)
                     user.save()
                    return redirect("/login/")
             else:
                 err_msg = '原密码输入错误'
         content = {
             'err_msg': err_msg,
         }
         return render(request, 'set_password.html', content)
     
    二、基本使用
    1.创建一个app,命令:python  manage.py startapp Myapp(命名不做要求)
     
    2.settings.py:
    INSTALLED_APPS = [
      'django.contrib.admin',
      'django.contrib.auth',
      'django.contrib.contenttypes',
      'django.contrib.sessions',
      'django.contrib.messages',
      'django.contrib.staticfiles',
      # 激活app
      'Myapp'
    ]
      
    # 更改数据库连接
    DATABASES = {
      'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST' : 'localhost',
        'PORT' : 3306,
        'NAME' : 'mysql',
        'USER': 'root',
        'PASSWORD' : '123456'
      }
    }
     
    在总urls.py下:
    from django.contrib import admin
    from django.urls import path,include
      
    urlpatterns = [
      path('admin/', admin.site.urls),
      #更改url匹配,定向到myApp的urls中,当主机地址后面参数时,到myApp中找链接
      path('',include('Myapp.urls'))
    ]
     
    3.__init__.py:设置数据库连接
    import pymysql
    pymysql.install_as_MySQLdb()
    4.urls.py:
    from django.urls import path
    from . import views
      
    urlpatterns = [
      #主页,用来显示类别等其他数据
      path('',views.index),
      # 登录
      path('tologin/',views.tologin),
      # 注册
      path('register/',views.register),
      # 注销
      path('lagout/',views.lagout),
    ]
    5.views.py:
    from django.shortcuts import render, redirect
    from django.http import HttpResponseRedirect
    from django.contrib.auth.models import User
    from django.contrib.auth import authenticate,login,logout
    from django.contrib.auth.models import AnonymousUser
      
    # Create your views here.
    # 主页
    def index(request,):
      username = request.user
      return render(request,'Myapp/index.html',locals())
      
    # 登录
    def tologin(request):
      if request.method == 'POST' and request.POST:
        data = request.POST
        username = data.get('username')
        password = data.get('password')
        n = authenticate(username=username,password=password)
        if n:
          # 登陆成功即可获取当前登录用户,返回主页
          login(request,user=n)
          return redirect('/')
      # 失败重定向到登录页
      return render(request, 'myApp/login.html')
      
    # 注册
    def register(request):
      if request.method == 'POST' and request.POST:
        data = request.POST
        username = data.get("username")
        password = data.get("password")
        # 校验注册,名字不可重复
        u = User.objects.filter(username=username).first()
        if u:
          info = '该用户名已被注册'
          return render(request,'Myapp/ERROR.html',{'info':info})
        else:
          # 注册成功,创建用户
          User.objects.create_user(username=username,password=password)
          # 重定向到登录页面
          return HttpResponseRedirect('/tologin/')
      # 注册失败,重新注册
      return render(request,'Myapp/register.html')
      
    def logout(request):
      logout(request)
      return redirect('/')
    6,执行命令
    执行生成迁移文件:python manager.py makemigrations
    生成迁移:python manager.py migrate
     
    7.启动服务:
    运行命令:python manager.py runserver

  • 相关阅读:
    小知识,大应用--正交向量在CDMA中的运用
    翻译:做好iPhone程序的10点建议
    解决了对多层结构一些疑惑,整理一下!
    原来是这样的——生活中的随笔
    3.14..............
    基础 - 结构
    推荐一本书《我编程,我快乐》
    基础 - 异常处理
    今天发现一个以前写的管理代码片段的程序,把源码发出来!
    VNC快速教程
  • 原文地址:https://www.cnblogs.com/absoluteli/p/13984275.html
Copyright © 2020-2023  润新知