django前后端分离rest_framework框架使用详解和使用方法

rest_framework框架认识

简单来说这个框架是基于django的,可以帮助我们快速的开发符合RESTful规范的接口框架。是使用django开发前后端分离的框架,
如果你英文水平比较好可以看rest_framework框架官网像博主这个英文渣渣就算了,

配置

博主的版本信息:
python=3.6.8
django=2.1.7
djangorestframework=3.9.2

settings配置

在settings里面的INSTALLED_APPS中添加‘rest_framework’

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app1.apps.App1Config',
    'xadmin',
    'crispy_forms',
    'rest_framework',    # 配置restframework
]

urls

这里就不多说了,大家既然都使用restframework框架了,这个就不在话下了,

urlpatterns = [
    path('register/',Register.as_view()),
    path('login/',Login.as_view()),

]

models

这个是为了测试框架随便建的数据库,在实用性上不好,但是可以很好的体现restframework框架的应用,就不要在意这些细节了,嘻嘻,

from django.db import models
# Create your models here.
# 用户
class User(models.Model):
    ADMIN_CHOICES = ((0,'管理员'),(1,'普通用户'))
    username = models.CharField(max_length=255,verbose_name='用户名',unique=True)
    password = models.CharField(max_length=255,verbose_name='用户密码')
    is_admin = models.BooleanField(verbose_name='是管理员',choices=ADMIN_CHOICES,default=1)
    is_delete = models.BooleanField(verbose_name='逻辑删除',default=0)

    class Meta:
        verbose_name = '账号信息'
        verbose_name_plural = '账号信息管理'
    def __str__(self):
        return self.username

# 用户信息
class UserInfo(models.Model):
    user = models.OneToOneField(to='User',verbose_name='用户',on_delete=models.CASCADE)
    company = models.ForeignKey(to='Company',verbose_name='公司',on_delete=models.DO_NOTHING)
    department = models.CharField(max_length=255,verbose_name='部门',default='')
    real_name = models.CharField(max_length=255,verbose_name='真实姓名',default='')
    phone = models.CharField(max_length=50,verbose_name='手机号')
    email = models.CharField(max_length=100,verbose_name='邮箱')

    class Meta:
        verbose_name = '用户信息'
        verbose_name_plural = '用户信息管理'

    def __str__(self):
        return self.user.username

# 用户登录记录
class UserLoginLog(models.Model):
    user = models.ForeignKey(to='User',verbose_name='用户',on_delete=models.CASCADE)
    ip = models.CharField(max_length=128,verbose_name='登录IP地址')
    data_time = models.DateTimeField(auto_now=True,verbose_name='登录时间')

    class Meta:
        verbose_name = '用户登录日志'
        verbose_name_plural = '登录日志管理'

    def __str__(self):
        return self.user.username

# 公司
class Company(models.Model):
    company_name = models.CharField(max_length=255,verbose_name='公司名称')
    address = models.CharField(max_length=255,verbose_name='公司地址',default='')
    phone = models.CharField(max_length=50,verbose_name='公司电话',default='')

    class Meta:
        verbose_name = '公司'
        verbose_name_plural  = '公司管理'

    def __str__(self):
        return self.company_name

views视图

这个是注册,简单看看就行,这个不是重点,也没有用到restframework框架

因为是测试,所以密码就没有加密存储,
这里面继承的是APIView,我发现有篇文章说的比我清楚,所以在这里就不做解释了,直接给你连接
Django通用视图APIView和视图集ViewSet的介绍和使用

from rest_framework import serializers
from rest_framework.response import Response
from rest_framework.views import APIView
from app1.models import *
from . import serializers
class Register(APIView):
    # 注册
    def post(self,request):
    	# 继承的是APIview,重写了django的view方法,所以使用request.data
        username = request.data.get('username')
        password = request.data.get('password')
        is_admin = request.data.get('is_admin','1')   # 0 管理员  1 普通用户
        if username and password:
            if not User.objects.filter(username=username).exists():
                User.objects.create(username=username,password=password,is_admin=is_admin)
                return Response({'code':200,'msg':'注册成功'})
            else:
                return Response({'code':401,'msg':'用户名已存在'})
        else:
            return Response({'code':400,'msg':'参数错误'})
这里是登录操作,返回的内容,进行了序列化,
from rest_framework import serializers
from rest_framework.response import Response
from rest_framework.views import APIView
from app1.models import *
from . import serializers
class Login(APIView):
    # 登录
    def post(self,request):
    	# 继承的是APIview,重写了django的view方法,所以使用request.data
        username = request.data.get('username')
        password = request.data.get('password')
        if username and password:
            user = User.objects.filter(username=username,password=password)
            if user.exists():
                # 登录记录 ,获取登录ip
                ip = request.META.get('REMOTE_ADDR')
                UserLoginLog.objects.create(user=user.first(),ip=ip)
                logs = UserLoginLog.objects.filter(user=user.first()).order_by('-data_time')[:5]
                userinfo = UserInfo.objects.filter(user=user.first())
                # 重要操作,进行序列化,需要在app里面新建一个文件serializers.py,在里面进行序列化操作
                # 这个文件内容在下面
                logs_user = serializers.UserLoginLogSerializer(logs,many=True).data
                info_user = serializers.UserInfoSerializer(userinfo,many=True)

                return Response({'code': 200, 'msg': '登录成功','info':info_user.data,'logs':logs_user})
            else:
                return Response({'code': 401,'msg':'用户名或密码错误'})

serializers.py

在你的APP里面创建一个serializers.py文件

from app1.models import *
from rest_framework import serializers
# 用户信息序列化类
class UserInfoSerializer(serializers.ModelSerializer):
    class Meta:
    	# 要进行序列化的model
        model = UserInfo
        # 序列化的字段,这里面的字段必须是models里买呢UserInfo里面的字段,其中user和company是外键
        fields = ['user','company','department','real_name','phone','email']
	# 这里是user和company在models里面是外键,所以要再次进行操作
    user = serializers.SerializerMethodField()
    company = serializers.SerializerMethodField()

    def get_user(self,obj):
    	# 这里是对user外键进行的操作,里面数据是User表中的字段
        return {'username':obj.user.username,'password':obj.user.password,}

    def get_company(self,obj):
    	# 这里是对company外键进行的操作,里面数据是Company表中的字段
        return {'company_name':obj.company.company_name,'address':obj.company.address,'phone':obj.company.phone}

# 登录记录序列化类
class UserLoginLogSerializer(serializers.ModelSerializer):
    class Meta:
    '''
    这个表里面没有外键,就只需要把字段列出来就行,
	'''
        model = UserLoginLog
        fields = ['id','ip','data_time']

如果你想要多序列化里面的数据进行修饰操作,举个例子,如下:
就以’’登录记录序列化操作‘‘为例

# 登录记录序列化类
class UserLoginLogSerializer(serializers.ModelSerializer):
    class Meta:
    '''
    这个表里面没有外键,就只需要把字段列出来就行,
	'''
        model = UserLoginLog
        fields = ['id','ip','data_time']
        # fields = ['id','ip','time']
    '''
	以下内容就是这里对data_time字段内容进行的修饰操作,和对外键的操作基本相同,
	当然也可以更改表中字段的名称,注释掉的就是,
	'''
	data_time= serializers.SerializerMethodField()
	# time= serializers.SerializerMethodField()
    def get_data_time(self,obj):
    # def get_time(self,obj):
        return str(obj.date_time.date()) + "--" + str(obj.date_time.time())

好吧,就写那么多吧,我也是刚接触这个框架,如有错误或者不足之处,还请指教,

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值