django rest framework总结

326 阅读1分钟

这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战

学习了一段时间的rest framework一段时间,自己实际使用,在我们原有的项目基础之上,做了一些修改,成功实现rest framework。下面是自己的代码:

setting.py


authentication_classes = ['rest_framework.authentication.SessionAuthentication',
                          'api.authentication.CustomTokenAuthentication']

REST_FRAMEWORK = {
    # 数据格式
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
    ),
    # 身份认证
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated'
    ],
    'DEFAULT_AUTHENTICATION_CLASSES': authentication_classes,
    'DEFAULT_PAGINATION_CLASS': 'biz.pagination.ExPageNumberPagination',
    # 访问频次控制
    'DEFAULT_THROTTLE_RATES': {
        "Luffy": '3/m',
        "LuffyUser": '10/m',
    },
    # 版本控制
    "DEFAULT_VERSIONING_CLASS": "rest_framework.versioning.URLPathVersioning",
    "DEFAULT_VERSION": 'v1',
    "ALLOWED_VERSIONS": ['v1', 'v2'],
    "VERSION_PARAM": 'version',

    'PAGE_SIZE': 10
}

urls.py

url(r'^restaurant/console/(?P<version>[v1|v2]+)/table/', class_table.TableView.as_view(), name='uuu'),

table_views.py

# coding=utf-8
from rest_framework import serializers
from rest_framework.throttling import SimpleRateThrottle
from rest_framework.views import APIView

from api.authentication import CustomTokenAuthentication
from biz import models
from biz.models import Restaurant, Table
from biz.services import table_service
from biz.utils import ret_message


# 未登陆的用户访问频次限制
class VisitThrottle(SimpleRateThrottle):
    scope = "Luffy"

    def get_cache_key(self, request, view):
        return self.get_ident(request)


# 登陆用户的访问频次限制
class UserThrottle(SimpleRateThrottle):
    scope = "LuffyUser"

    def get_cache_key(self, request, view):
        return request.user.username


# 序列化(检查输入数据的基类)
class BaseFormSerializer(serializers.Serializer):
    restaurant_id = serializers.IntegerField(error_messages={'required': '没有店铺ID参数'})

    def __init__(self, *args, **kwargs):
        self.store_id = kwargs.pop('store_id')
        self.restaurant = None
        super(BaseFormSerializer, self).__init__(*args, **kwargs)

    def validate_restaurant_id(self, attrs):
        restaurant = Restaurant.objects.filter(id=attrs, store__store_id=self.store_id).first()
        if not restaurant:
            raise serializers.ValidationError('请求参数错误:restaurant_id 错误')
        self.restaurant = restaurant
        return attrs


class TableAddFormSerializer(BaseFormSerializer):
    table_no = serializers.CharField(error_messages={'required': '没有table_no参数'})
    size = serializers.CharField(error_messages={'required': '没有size参数'})


# 这里使用钩子函数,检查ID是不是存在
class TableDeleteFormSerializer(BaseFormSerializer):
    id = serializers.IntegerField(error_messages={'required': '没有id参数'})

    def validate_id(self, attrs):
        if not Table.objects.filter(id=attrs, restaurant=self.restaurant).exists():
            raise serializers.ValidationError('桌号({})错误'.format(attrs))
        return attrs


class TableUpdateFormSerializer(TableDeleteFormSerializer, TableAddFormSerializer):
    pass


# 返回前端数据格式
class TableJsonSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Table
        fields = "__all__"
        # fields = ['id', 'restaurant_id', 'table_no', 'size']
        depth = 0  # 0 ~ 10


class TableView(APIView):
    authentication_classes = [CustomTokenAuthentication, ]
    throttle_classes = [UserThrottle, ]

    def post(self, request, *args, **kwargs):
        ser = TableAddFormSerializer(data=request.data, store_id=request.user.username)
        if ser.is_valid():
            table = table_service.create_table(ser.validated_data)
            return ret_message(0, message="OK", data={'table_id': table.id})
        return ret_message(0, message=ser.errors.values()[0][0])

    def delete(self, request, *args, **kwargs):
        ser = TableDeleteFormSerializer(data=request.data, store_id=request.user.username)
        if ser.is_valid():
            table_service.delete_table(ser.validated_data['id'])
            return ret_message(0, message="OK")
        return ret_message(0, message=ser.errors.values()[0][0])

    def put(self, request, *args, **kwargs):
        ser = TableUpdateFormSerializer(data=request.data, store_id=request.user.username)
        if ser.is_valid():
            table_service.update_table(ser.validated_data)
            return ret_message(0, message="OK")
        return ret_message(0, message=ser.errors.values()[0][0])

    def get(self, request, *args, **kwargs):
        id = request.GET.get('id')
        restaurant_id = request.GET.get('restaurant_id')
        if id:
            table = table_service.get_by_id(id, restaurant_id)
            return ret_message(0, message="OK", data=table)

        table_size = request.GET.get('table_size')
        tables = table_service.list_table(request.user.username, restaurant_id, table_size)

        return ret_message(0, message="OK", data=tables)