django8.1 内建的用户系统

django 内建的用户系统

  django带有一个用户认证系统。它可以处理用户账号、组、权限以及给予cookie的用户会话。
  用户可以直接使用django自带的用户表。

  1. 模型类:

    1. 位置:from django.contrib.auth.models import User
    2. 属性有:username,password,email,first_name,last_name,is_superuser(是否是管理员账号),is_staff(是否可以访问admin管理界面,是自己的员工,还是公司的客户),is_active(用于伪删除),last_login(上一次的登录时间),date_joined(用户创建的时间)
    3. 可以在mysql中看,表名叫auth_user;(应用名叫auth,模型名叫User,按照常规的规则,表名就是应用名_模型类名的全小写
  2. 基本模型操作:

    1. 创建用户:

      from django.contrib.auth.models import User
      user = User.objects.create_user(username='',password='',email='',.....)
      #create_user方法会自动处理密码的加密操作,
      
    2. 创建超级用户:

      from django.contrib.auth.models import User
      user = User.objects.create_superuser(username='',password='')
      
    3. 删除用户:

      from django.contrib.auth.models import User
      try:
      	user = User.objects.get(username='用户名')
      	user.is_active = False
      	user.save()
      	print("删除普通用户成功")
      except:
      	print("删除普通用户失败")
      
    4. 校验密码:

      from django.contrib.auth.models import User
      user = authenticate(username=username,password=password)
      #如果用户名和密码校验成功,则返回对应的user对象,否则返回None,
      
    5. 修改密码:

      from django.contrib.auth.models import User
      try:
      	user = User.objects.get(username='')
      	user.set_password('')
      	user.save()
      	return HttpResponse('修改密码成功')
      except:
      	return HttpResponse('修改密码失败')
      
    6. 登录状态保持:

      from django.contrib.auth import login
      def login_view(request):
      	#先校验用户名和密码是不是对的。
      	user = authenticate(username=username,password=password)
      	#只存session,而且时间不可控,如果user存在的话就执行下面这个代码,None的话就执行其他的
      	if user:
      		login(request,user)
      
    7. 登录状态校验:

      from django.contrib.auth.decorators import login_required
      @login_required
      #哪个视图函数需要校验登陆状态,就放到哪个视图函数上边。如果登录了,就接着往下走,如果没登录,一般就弹到指定的网址,在settings中设置。
      def index_view(request)#该视图必须为用户登录状态下才可以访问
      	#当前登录的用户可以通过request.user获取
      	login_user = request.user
      
    8. 登录状态取消:

      from django.contrib.auth import logout
      def logout_view(request);
      	logout(request)
      
    9. 扩展字段:

      1. 方案一: 自己创建个应用,再创建个表,把自己创建的表和内建的表做一个1对1,一对一映射,让新表的数据和内建的表产生关联。
      2. 方案二(推荐):继承內建的抽象user模型类(抽象user模型类指的是可以把它的所有字段继承过来)
        1. 步骤:

          1. 添加新的应用。
          2. 定义模型类,继承AbstractUser
          3. settings.py中指明AUTH_USER_MODEL=‘应用名.类名’
          4. 注意:此操作要在第一次makemigrations migrate之前进行。确保当前那个auth_user表没有被初始化出来。
        2. 举例:

          1. 创建应用(记得注册):python manage.py startapp user
          2. 定义模型类:
            from django.db import models
            from django.contrib.auth.models import AbstractUser
            class UserInfo(AbstractUser):
            	phone = models.CharField(max_length=11,default='')
            
          3. 在settings中配置:AUTH_USER_MODEL='user.UserInfo'
          4. 数据库迁移,生成表:python manage.py makemigrations ; python manage.py migrate
          5. 添加用户:(在django shell中就挺方便,python manage.py shell启动)
            from user.models import UserInfo
            UserInfo.objects.create(username='',password='',phone='')
            
  3. 案例:使用django內建的用户系统实现注册、登录、退出等功能

    1. 铺垫:

      1. 创建项目:django-admin startproject 项目名;
      2. 创建数据库:mysql -uroot -p进入mysql,使用create database 数据库名 default charset utf8创建数据库;
      3. 模板文件夹:手动创建templates文件夹,用于存放模板文件,并在settings中配置变量TEMPATES的DIRS:'DIRS': [os.path.join(BASE_DIR,'templates')],
      4. 配置数据库:修改settings中的DATABASES:
        DATABASES = {
            'default': {
                'ENGINE': 'django.db.backends.mysql',
                'NAME': 'd_user',
                'USER': 'root',
                'PASSWORD': '你数据库的密码',
                'HOST': '127.0.0.1',
                'PORT': '3306'
            }
        }
        
      5. 语言和时区的配置:修改settings文件: LANGUAGE_CODE = 'zh-Hans' TIME_ZONE = 'Asia/Shanghai'
    2. 开发:

      1. 注册功能:

        1. 路由:先在urls.py文件中引入views:from . import views,再创建路由:path('register',views.register_view),

        2. 视图函数:

          def register_view(request):
              #注册
              #分get和post进行处理:点击注册时,是get请求,负责render一个页面,在注册界面提交信息时,是post请求,负责处理数据
              if request.method == 'GET':
                  return render(request,'register.html')
              elif request.method == 'POST':
                  username = request.POST['username']
                  password_1 = request.POST['password_1']
                  password_2 = request.POST['password_2']
                  if password_1 != password_2:
                      return HttpResponse('两次密码输入不一致')
                  #TODO 查询用户名是否已经注册
          
                  #务必使用create_user创建用户
                  user = User.objects.create_user(username=username,password=password_1)
          
                  #如果需要注册后免登录
                  # login(request,user)
                  # return HttpResponseRedirect('/index')
          
                  return HttpResponseRedirect('/login')
          
        3. 模板文件:

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <title>注册</title>
          </head>
          <body>
          <form action="/register" method="post">
              {% csrf_token %}
              <p>
                  用户名:<input type="text" name="username">
              </p>
              <p>
                  密码:<input type="text" name="password_1">
              </p>
              <p>
                  确认密码:<input type="text" name="password_2">
              </p>
              <p>
                  <input type="submit" value="注册">
              </p>
          </form>
          </body>
          </html>
          
      2. 登录功能:

        1. 路由:path('login',views.login_view),

        2. 视图函数:

          def login_view(request):
              #登录
              if request.method == 'GET':
                  return render(request,'login.html')
              elif request.method == 'POST':
                  username = request.POST['username']
                  password = request.POST['password']
          
                  #校验用户信息
                  user = authenticate(username=username,password=password)
          
                  if not user:
                      return HttpResponse('用户名或密码错误')
                  else:
                      #校验成功
                      #记录会话状态
                      login(request,user)
                      return HttpResponseRedirect('/Info')
          
        3. 模板文件:

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <title>登录</title>
          </head>
          <body>
          <form action="/login" method="post">
              {% csrf_token %}
              <p>
                  用户名: <input type="text" name="username">
              </p>
              <p>
                  密码: <input type="password" name="password">
              </p>
              <p>
                  <input type="submit" value="登录">
              </p>
          
          </form>
          </body>
          </html>
          
      3. 退出功能:

        1. 路由:path('logout',views.logout_view),
        2. 视图函数:
          def logout_view(request):
              #退出
              logout(request)
              return HttpResponse('已退出')
          
      4. 信息页:

        1. 路由:path('Info',views.Info_view)
        2. 视图函数:
          @login_required
          def Info_view(request):
              #首页,必须登录才能访问,未登录跳转至settings.LOGIN_URL
              user =request.user
              return HttpResponse('欢迎 %s 来到 测试内部验证的首页'%(user.username))
          
      5. 首页:因为只是测试内建用户系统的功能,所以首页和信息页设计的就很简单

        1. 路由:path('index',views.index_view)
        2. 视图函数:
          def index_view(request):
              return render(request,'index.html')
          
        3. 模板文件:
          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <title>test</title>
          </head>
          <body>
          <p>
              <a href="/register">注册</a>
          </p>
          <p>
              <a href="/login">登录</a>
          </p>
          </body>
          </html>
          
      6. 登录情况下的跳转地址:在settings中添加LOGIN_URL = '/login'

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值