django-drf实现驾校系统后端(1)

这个系列差不多算是我入门学习的一个笔记,想用这个驾校系统来记录一下自己django-drf的学习路程~

1.使用pycharm创建一个django项目,命名为drivingSchool

2.在项目同名目录的settings中,添加以下修改:

1)使用mysql数据库,因为django自带的是sqlite,注意这个数据库需要提前在mysql中创建:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'xxxx',  # 数据库名
        'USER': 'root',  # 用户名
        'PASSWORD': 'xxxxx',  # 密码
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

并且在项目同名目录的__init__.py中添加:

import pymysql
pymysql.install_as_MySQLdb()

2)配置redis:

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/2",  # 最后一位数字代表了DB number 指定的redis数据库号
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"decode_responses": True, "max_connections": 100},
         
        }
    }
}

py3从redis取出来的string默认为bytes类型,所以需要加上decode_responses": True这一句,使得取出来的数据自动变成string

3)设置验证方式为自定义验证:

REST_FRAMEWORK = {
    # 使用自定义的认证
    "DEFAULT_AUTHENTICATION_CLASSES": ['common.utils.auth.Authentication', ]
}

4)设置跨域相应头headers,最后的auth-token为用于验证用户登录的token信息:

CORS_ALLOW_HEADERS = (
    'XMLHttpRequest',
    'X_FILENAME',
    'accept-encoding',
    'authorization',
    'content-type',
    'dnt',
    'origin',
    'user-agent',
    'x-requested-with',
    'Pragma',
    'auth-token',  # 用于用户的请求头
)

5)在INSTALLED_APPS里面要添加这两行:

'rest_framework',
'corsheaders',

3.在终端运行python manage.py startapp xxx创建一个app。xxx是这个app的名称。

4.创建一个名为common的app。

1)在models中创建需要的表。

例如教练信息表:

class Instructor(models.Model):
    # 教练账号
    instructorID = models.AutoField(primary_key=True)
    # 姓名
    name = models.CharField(max_length=100)
    # 自己的学生
    student = models.ForeignKey('Student', on_delete=models.SET_NULL,null=True,related_name='student')
    # 自己的预约
    appointment = models.ForeignKey('Appointment', on_delete=models.SET_NULL,null=True,related_name='I_appointment')
    # 教龄
    workingTime = models.IntegerField()
    # 创建日期,model生成自动生成时间
    createTime = models.DateTimeField(auto_now_add=True)
    # 更新时间,更新model时修改时间
    updateTime = models.DateTimeField(auto_now=True)
    # 密码
    passWord = models.CharField(max_length=100)
    # 手机号
    phoneNumber = models.CharField(max_length=100)

这里的student列使用了外键方式和student表进行关联,如果有多个属性关联了同一张表,注意要设置related_name,不然会报错。

然后在settings的INSTALLED_APPS里面添加这一行

# 添加这个让数据库关注到我们common models中定义的类
'common.apps.CommonConfig',

然后控制台输入命令python manage.py makemigrations common;python manage.py migrate进行表生成。

2)建立auth文件,并且自定义authenticate方法对于用户进行验证:

from django_redis import get_redis_connection
from rest_framework.authentication import BaseAuthentication

from common.models import *


class Authentication(BaseAuthentication):

    def authenticate(self, request):
        rconn = get_redis_connection('default')
        token = request.headers['auth-token']  # 获取响应头中的token
        # 先查看这个token在redis中是否存在
        if not rconn.exists(token):
            user = None
        else:
            # 判断这个hmap里有没有phone number这个属性
            if not rconn.hexists(token, 'role'):
                user = None
            else:
                # 判断这个token能否在redis中有对应的角色和账号
                role = int(rconn.hget(token, 'role'))
                account = str(rconn.hget(token, 'account'))
                # 如果找到对应的账号,则说明请求合法
                if role is not None:
                    # 1,2,3分别代表学员、管理员、教练
                    if role == 1:
                        user = Student.objects.filter(phoneNumber=account).first()
                    elif role == 2:
                        user = Manager.objects.filter(managerID=account).first()
                    else:
                        user = Instructor.objects.filter(InstructorID=account).first()
                else:
                    user = None
        # 返回的结果将赋值给request对象.  request.user  request.auth可以分别获取到这两个值yeah!!
        return user, token

    def authenticate_header(self, request):
        pass


注意student对象可以通过request.user获取;token可以通过request.auth获取。

5.编写序列化器:

这里针对student进行序列化和反序列化:

# 用于获取学员的基本信息
class StudentSerializer1(serializers.ModelSerializer):
    class Meta:
        model = models.Student
        fields = ['name', 'IDNumber', 'phoneNumber', 'instructor']

fields里面可以设置获取的表字段。

接下来是反序列化:

p = request.user
user = StudentSerializer1(p)

你可能感兴趣的:(django-drf,django,python)