这个系列差不多算是我入门学习的一个笔记,想用这个驾校系统来记录一下自己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)