这是我参与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)