第一节 登录和认证

一、创建虚拟环境

1.一个项目对应一个虚拟环境
mkvirtualenv -p /usr/bin/python3 promote

在这里插入图片描述

2.下载安装django(使用django项目做框架)
 pip install django -i https://pypi.douban.com/simple

在这里插入图片描述

3.下载安装drf
pip install djangorestframework -i https://pypi.douban.com/simple

在这里插入图片描述

4.下载安装pymysql(使用mysql数据库)
pip install pymysql -i https://pypi.douban.com/simple

在这里插入图片描述

在这里插入图片描述

二、创建数据库

1.
mysql -uroot -p
create database `promote` charset='utf8';
grant all privileges on `promote`.* to 'promoteu'@'%' identified by 'qwe123';
mysql -upromoteu -p
show databases;

在这里插入图片描述

三、创建django项目

1.创建项目
django-admin startproject promote

在这里插入图片描述

2.给pycharm创建新的项目和项目的配置

https://editor.csdn.net/md/?articleId=121496997

四、settings.py 相关配置

https://editor.csdn.net/md/?articleId=121498949

五、创建APP目录

1.新建文件用于存放各类APP,并设置为资源目录(APP目录)

在这里插入图片描述

sys.path.insert(0, BASE_DIR)
sys.path.insert(1, os.path.join(BASE_DIR, 'apps'))

在这里插入图片描述

六、

在这里插入图片描述

1.创建映射文件提交到数据库

在这里插入图片描述

2.创建超级管理员

在这里插入图片描述

3.访问后台管理系统

在这里插入图片描述
在这里插入图片描述

4.创建两个组

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.创建用户,选择用户组

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

七、完成登录接口开发

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.保存私钥,防止泄露

在这里插入图片描述
在这里插入图片描述

2.设置保密(屏蔽config)

在这里插入图片描述

在这里插入图片描述

3.下载drf认证模块
pip install djangorestframework-jwt -i https://pypi.douban.com/simple

在这里插入图片描述

4.配置令牌过期时间
# 过期时间配置
JWT_AUTH = {
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
}

在这里插入图片描述

5.jwt 自带登录接口,配置路由(放在总路由不合适,先创建APP)
6.APP

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.登录

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

八、连接数据库(pycharm连接数据量做格式化)

1.连接数据库

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

九、班级管理模块

1.再创建一个APP

在这里插入图片描述

在这里插入图片描述

2. 创建模型
from django.db import models
from django.contrib.auth.models import User   # Django认证里面的User模型


# Create your models here.

class Classes(models.Model):
    name = models.CharField(max_length=30, verbose_name='班级名')
    slogan = models.TextField(verbose_name='口号', null=True, blank=True)
    create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
    update_time = models.DateTimeField(verbose_name='修改时间', auto_now=True)
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')

    number = models.ManyToManyField(User)

    class Meta:
        db_table = 'classes'
        verbose_name = '班级'   # 后台显示的名字
        verbose_name_plural = verbose_name

    def delete(self, using=None, keep_parents=False):
        self.is_delete = True
        self.save()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.写序列化器
from rest_framework.serializers import ModelSerializer
from .models import Classes


class ClassesSerializer(ModelSerializer):
    class Meta:
        model = Classes  # 指定model映射的模型类
        exclude = ['id', 'is_delete']

在这里插入图片描述

4.写视图
from rest_framework.viewsets import ModelViewSet
from .models import Classes
from .serializers import ClassesSerializer


class ClassesViewSet(ModelViewSet):
    queryset = Classes.objects.filter(is_delete=False)  # 查询集
    serializer_class = ClassesSerializer

在这里插入图片描述

5.配置路由
from rest_framework.routers import DefaultRouter
from .views import ClassesViewSet

urlpatterns = [

]

router = DefaultRouter()  # 创建路由器
router.register('classes', ClassesViewSet)  # 注册路由
urlpatterns += router.urls  # 拼接路由

在这里插入图片描述
在这里插入图片描述

6.访问

在这里插入图片描述


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.添加数据

在这里插入图片描述
在这里插入图片描述

优化1
from rest_framework.serializers import ModelSerializer
from django.contrib.auth.models import User


class UserSerializer(ModelSerializer):
    class Meta:
        model = User
        exclude = ['id', 'password']

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

优化2
from rest_framework.serializers import ModelSerializer
from .models import Classes
from users.serializers import UserSerializer
from rest_framework.fields import SerializerMethodField


class ClassesSerializer(ModelSerializer):
    # number = UserSerializer(many=True)   # 序列化的嵌套

    # 我们的班级在做序列化的时候,它会执行get_number的方法,同时将要序列化的实例对象(Classes),作为参数传递进去
    number = SerializerMethodField()

    class Meta:
        model = Classes  # 指定model映射的模型类
        exclude = ['id', 'is_delete']

    def get_number(self, classes):  # 得到班级查询出来的实例化模型对象,将返回的数据赋予number
        serializer = UserSerializer(classes.number.all(), many=True)  # 拿到班级的所有数据
        data = {
            'teacher': [i for i in serializer.data if i['is_staff'] or 1 in i['groups']],
            'student': [i for i in serializer.data if 2 in i['groups']]
        }
        return data  # 返回的数据会赋值给number

在这里插入图片描述
在这里插入图片描述

优化3

在这里插入图片描述
在这里插入图片描述

优化4

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


在这里插入图片描述

十、认证

1. 配置
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',  # 全局认证方式为JWT认证方式
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication',
    ),
}

在这里插入图片描述

from rest_framework.viewsets import ModelViewSet
from .models import Classes
from .serializers import ClassesSerializer
from rest_framework.permissions import IsAuthenticated


class ClassesViewSet(ModelViewSet):
    # 局部权限设置
    permission_classes = [IsAuthenticated]  # 登录才有权限
    queryset = Classes.objects.filter(is_delete=False)  # 查询集
    serializer_class = ClassesSerializer

在这里插入图片描述
在这里插入图片描述

2.测试(postman工具)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

说明:这里拿另一个账户登录的令牌也是可以访问的,因此存在安全隐患,需要自制令牌权限
3.自定义权限
from django.contrib.auth.models import Group
from rest_framework.permissions import BasePermission


class MyPermission(BasePermission):  # 自定义权限认证类
    def has_permission(self, request, view):  # 重写权限认证方法
        user = request.user
        # 获取有权限的分组,老师
        group = Group.objects.filter(name='老师').first()
        # 获取令牌用户所属的分组
        groups = user.groups.all()
        return user.is_superuser or group in groups

在这里插入图片描述

配置权限

在这里插入图片描述


在这里插入图片描述
在这里插入图片描述


在这里插入图片描述

4.优化(返回token同时返回用户名)

自定义验证成功并返回数据

1.配置
def jwt_token(token, user=None, request=None):
    """自定义登录成功返回数据处理"""
    data = {
        'token': token,
        'username': user.username,
    }

    return data

在这里插入图片描述

 'JWT_RESPONSE_PAYLOAD_HANDLER': 'users.utils.jwt_token',

在这里插入图片描述


在这里插入图片描述

  • 2
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YY2065

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值