django rest_framework比较完整的自定义实现样例
里面有自定义的更新策略,
序列化时,考虑nest及显示。
很有参考意义。
然后,前端,可以考虑用angular.js或vue.js实现。
每次以token进行认证。
url.py
router = DefaultRouter() router.register(r'subserver', api_views.SubserverViewSet, base_name="subserver") router.register(r'deploypool', api_views.DeployPoolViewSet, base_name="deploypool") router.register(r'versionpool', api_views.VersionPoolViewSet, base_name="versionpool") router.register(r'users', api_views.UserViewSet, base_name="users") router.register(r'server', api_views.ServerViewSet, base_name="server") router.register(r'site', api_views.SiteViewSet, base_name="site") router.register(r'app', api_views.AppViewSet, base_name="app")
serializers.py
class UserSerializer(serializers.HyperlinkedModelSerializer):
deploy_create_user = serializers.HyperlinkedRelatedField(many=True, view_name='api:deploypool-detail', read_only=True)
class Meta:
model = User
fields = ('id', 'username', 'deploy_create_user',)
class TokenSerializer(serializers.ModelSerializer):
token = serializers.ReadOnlyField(source='create_user.username')
class Meta:
model = User
fields = ('id', 'username', 'code', 'linenos', 'language', 'style')
class ServerSerializer(serializers.HyperlinkedModelSerializer):
ip_subserver = serializers.HyperlinkedRelatedField(many=True, view_name='api:subserver-detail', read_only=True)
# app_name = serializers.ReadOnlyField(source='app_name.name')
class Meta:
model = Server
fields = ('id', 'server_env', 'name', 'server_sys', 'ip_subserver')
class SubserverSerializer(serializers.HyperlinkedModelSerializer):
app_name = serializers.HyperlinkedRelatedField(view_name='api:app-detail', read_only=True)
# server_ip = serializers.ReadOnlyField(source='server_ip.name')
class Meta:
model = SubServer
fields = ('id', 'deploy_status', 'app_name', )
class SiteSerializer(serializers.HyperlinkedModelSerializer):
app_name = serializers.HyperlinkedRelatedField(many=True, view_name='api:app-detail', read_only=True)
class Meta:
model = Site
fields = ('id', 'name', 'app_name')
class SiteListSerializer(serializers.ModelSerializer):
class Meta:
model = Site
fields = ('id', 'name')
class DeployPoolSerializer(serializers.ModelSerializer):
create_user = serializers.ReadOnlyField(source='create_user.username')
site_name = serializers.ReadOnlyField(source='site_name.name')
version_name = serializers.ReadOnlyField(source='version_name.name')
app_name = serializers.ReadOnlyField(source='app_name.name')
class Meta:
model = DeployPool
fields = ('id', 'name', 'site_name', 'version_name', 'app_name',
'order_no', 'deploy_status', 'deploy_progress', 'create_user', 'change_date' )
class AppSerializer(serializers.HyperlinkedModelSerializer):
site_app = serializers.HyperlinkedRelatedField(many=True, view_name='api:site-detail', read_only=True)
class Meta:
model = SubServer
fields = ('id', 'name', 'site_app',)
class VersionPoolSerializer(serializers.ModelSerializer):
# 注意外键名称显示,nest field显示时的配置
site_name = serializers.ReadOnlyField(source='site_name.name')
dep_version = DeployPoolSerializer(many=True, required=False, read_only=True)
create_user = serializers.ReadOnlyField(source='create_user.username')
class Meta:
model = VersionPool
fields = ('id', 'name', 'site_name', 'is_order', 'version_progress', 'dep_version', 'create_user', 'add_date')
views.py
@csrf_exempt
def gettoken():
pass
class UserViewSet(viewsets.ReadOnlyModelViewSet):
"""
This viewset automatically provides `list` and `detail` actions.
"""
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes = (permissions.AllowAny,)
paginate_by = 10
def get_queryset(self):
queryset = self.queryset.filter(username='kevin')
return queryset
class SiteViewSet(viewsets.ReadOnlyModelViewSet):
"""
This viewset automatically provides `list` and `detail` actions.
"""
queryset = Site.objects.all()
serializer_class = SiteSerializer
permission_classes = (permissions.AllowAny,)
paginate_by = 10
class SiteListAPI(generics.ListAPIView):
"""
This ListAPIView automatically provides `list` actions.
"""
queryset = Site.objects.all()
serializer_class = SiteListSerializer
paginate_by = 1000
class AppViewSet(viewsets.ReadOnlyModelViewSet):
"""
This viewset automatically provides `list` and `detail` actions.
"""
queryset = App.objects.all()
serializer_class = AppSerializer
permission_classes = (permissions.AllowAny,)
paginate_by = 10
class ServerViewSet(viewsets.ModelViewSet):
"""
This viewset automatically provides `list` and `detail` actions.
"""
queryset = Server.objects.all()
serializer_class = ServerSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly, )
paginate_by = 10
class SubserverViewSet(viewsets.ReadOnlyModelViewSet):
"""
This viewset automatically provides `list`, `create`, `retrieve`,
`update` and `destroy` actions.
Additionally we also provide an extra `highlight` action.
"""
queryset = SubServer.objects.all()
serializer_class = SubserverSerializer
permission_classes = (permissions.AllowAny,)
paginate_by = 10
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
class DeployPoolViewSet(viewsets.ModelViewSet):
"""
This viewset automatically provides `list`, `create`, `retrieve`,
`update` and `destroy` actions.
Additionally we also provide an extra `highlight` action.
"""
serializer_class = DeployPoolSerializer
authentication_classes = (TokenAuthentication,)
paginate_by = 1000
def get_queryset(self):
filter_dict = dict()
if self.request.query_params.get('site_name'):
filter_dict['site_name__name'] = self.request.query_params.get('site_name')
if self.request.query_params.get('order_no'):
filter_dict['order_no'] = self.request.query_params.get('order_no')
if self.request.query_params.get('version_name'):
if self.request.query_params.get('version_name') == "null":
filter_dict['version_name__isnull'] = True
else:
filter_dict['version_name__name'] = self.request.query_params.get('version_name')
# 以下过滤发布单的环境及时间(30天)
# filter_dict['deploy_progress'] = u"待发布"
filter_dict['deploy_status__in'] = ["UAT", "PRD", "SIM", "DRP", "BUILD", "FAT", "DEV"]
current_date = timezone.now()
filter_dict['change_date__gt'] = current_date - timedelta(days=3000)
return DeployPool.objects.filter(**filter_dict)
def update(self, request, *args, **kwargs):
name = request.data['name']
order_no = request.data['order_no']
version_name = request.data['version_name']
try:
if version_name:
version_item = VersionPool.objects.get(name=version_name)
DeployPool.objects.filter(name=name).update(order_no=order_no, version_name=version_item)
else:
DeployPool.objects.filter(name=name).update(order_no=order_no, version_name=None)
response_data = {
'result': 'success',
'name': name,
'create_user': request.user.username,
'message': '更新发布单成功!'
}
return Response(response_data, status=status.HTTP_201_CREATED)
except:
response_data = {
'result': 'failed',
'message': '更新发布单失败!'
}
return Response(response_data, status=status.HTTP_400_BAD_REQUEST)
class VersionPoolViewSet(viewsets.ModelViewSet):
"""
This viewset automatically provides `list`, `create`, `retrieve`,
`update` and `destroy` actions.
Additionally we also provide an extra `highlight` action.
"""
queryset = VersionPool.objects.all()
serializer_class = VersionPoolSerializer
authentication_classes = (TokenAuthentication,)
paginate_by = 100
def get_queryset(self):
queryset = self.queryset
return queryset
# 如有需要,自定义update和create方法,以实现外键方面的关联
def create(self, request, *args, **kwargs):
name = request.data['name']
site_name = request.data['site_name']
validated_data = dict()
validated_data['name'] = site_name + "-" + name
try:
validated_data['site_name'] = Site.objects.get(name=site_name)
except:
response_data = {
'result': 'failed',
'name': site_name + "-" + name,
'create_user': request.user.username,
'message': '项目名不存在!'
}
return Response(response_data, status=status.HTTP_400_BAD_REQUEST)
validated_data['create_user'] = request.user
try:
VersionPool.objects.create(**validated_data)
response_data = {
'result': 'success',
'name': site_name + "-" + name,
'create_user': request.user.username,
'message': '创建版本单成功!'
}
return Response(response_data, status=status.HTTP_201_CREATED)
except:
response_data = {
'result': 'failed',
'name': site_name + "-" + name,
'create_user': request.user.username,
'message': '已存在相同版本单'
}
return Response(response_data, status=status.HTTP_400_BAD_REQUEST)
def update(self, request, *args, **kwargs):
if request.data["isOrder"] == "false":
is_order = False
else:
is_order = True
print request.data, "%%%%%%%%%%%%%%%%%%%%%%%%%"
VersionPool.objects.filter(id=kwargs["pk"]).update(is_order=is_order)
try:
response_data = {
'result': 'success',
'create_user': request.user.username,
'message': '更新版本单成功!'
}
return Response(response_data, status=status.HTTP_201_CREATED)
except:
response_data = {
'result': 'failed',
'message': '更新版本单失败!'
}
return Response(response_data, status=status.HTTP_400_BAD_REQUEST)
django rest_framework比较完整的自定义实现样例的更多相关文章
- 【转】k8s集群自定义clusterRole样例
对pod资源可以删除,进入终端执行命令,其他资源只读权限 apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: an ...
- 通过Canvas及File API缩放并上传图片完整演示样例
创建一个只管的用户界面,并同意你控制图片的大小.上传到server端的数据,并不须要处理enctype为 multi-part/form-data 的情况.只一个简单的POST表单处理程序就能够了. ...
- Android之——多线程下载演示样例
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46883927 一.概述 说到Android中的文件下载.Android API中明 ...
- python之Django rest_framework总结
一.rest api a.api就是接口 如: - http://www.oldboyedu.com/get_user/ - http://www. ...
- Django rest_framework 实用技巧
前言: 最近工作中需要用到Django rest_framework框架做API, 边学边写,记录了一些实际工作中需要用到的功能,不是很全也不系统,以后需要什么功能可以在这查询. 后续还会更新其它的用 ...
- 七、django rest_framework源码之视图
1 绪言 当大家看大这篇博文的时候,应该对Django rest_framework中的CBV有所了解了,大致来说就是通过定义类来继承APIView类,并在类中定义get.post.put.delet ...
- 四、django rest_framework源码之频率控制剖析
1 绪言 权限判定之后的下一个环节是访问频率控制,本篇我们分析访问频率控制部分源码. 2 源码分析 访问频率控制在dispatch方法中的initial方法调用check_throttles方法开始. ...
- 二、django rest_framework源码之认证流程剖析
1 绪言 上一篇中讲了django rest_framework总体流程,整个流程中最关键的一步就是执行dispatch方法.在dispatch方法中,在调用了一个initial方法,所有的认证.权限 ...
- CentOS7 + Python3 + Django(rest_framework) + MySQL + nginx + uwsgi 部署 API 开发环境, 记坑篇
CentOS7 + Python3 + Django(rest_framework) + MySQL + nginx + uwsgi 部署 API 开发环境 CentOS7 + Python3 + D ...
随机推荐
- C++中Vector求最大值最小值
vector<int> v: 最大值: int max = *max_element(v.begin(),v.end()); 最小值: int min = *min_element(v.b ...
- C++内存分配与释放
C++内存分配与释放 1. new 运算符 与 operator new一条 new 表达式语句( new Type; )中的 new 是指 new 运算符.operator new 是定义在 #in ...
- Codeforces 830B - Cards Sorting 树状数组
B. Cards Sorting time limit per test 1 second memory limit per test 256 megabytes input standard inp ...
- springboot创建maven多模块项目
SpringBoot创建maven多模块项目 项目结构 该项目名称为springboot-maven-multi,由springboot-maven-multi.user-dao.user-domai ...
- KeyDown,KeyPress和KeyUp详解(转)
1.按键的类型 Windows窗体将键盘输入标识为由按位Keys枚举表示的虚拟键代码.使用Keys枚举,可以综合一系列按键以生成单个值,这些值与WM_KEYDOWN和WM_SYSKEYDOWNWind ...
- Spring 与 SpringMVC 容器父子关系引出的相应问题
1)关系说明 spring 与 springmvc 父子关系:spring (父容器),springmvc (子容器) springmvc(子)--- 可调用 --> spring(父) 中的 ...
- Anniversary party(树形dp入门)
Anniversary party Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- 说说asp.net中的异常处理和日志追踪
关于异常的处理想必大家都了解try{}catch(){}finally{},这里就不再讲了.通过在VS里的"调试"-"异常",在弹出的异常对话框里的Common ...
- Stat2—主成分分析(Principal components analysis)
最近在猛撸<R in nutshell>这本课,统计部分涉及的第一个分析数据的方法便是PCA!因此,今天打算好好梳理一下,涉及主城分析法的理论以及R实现!come on…gogogo… 首 ...
- 【CodeForces】913 F. Strongly Connected Tournament 概率和期望DP
[题目]F. Strongly Connected Tournament [题意]给定n个点(游戏者),每轮游戏进行下列操作: 1.每对游戏者i和j(i<j)进行一场游戏,有p的概率i赢j(反之 ...