符合RESTful规范的API
统一使用的utils,serializers:
class BaseResponse: def __init__(self):
self.code = 1000
self.data = None
self.error = None @property
def dict(self):
return self.__dict__
版本1:
from django.conf.urls import url
from api.views import course
from api import views urlpatterns = [
url(r"courses/$",course.CoursesView.as_view()),
url(r"courses/(?P<pk>\d+)/$",course.CourseDetailView.as_view()), ]
urls
from django.shortcuts import HttpResponse
from rest_framework.views import APIView
from rest_framework.versioning import URLPathVersioning
from rest_framework.response import Response
from api.serializers import course
from api import models
from api.utils.response import BaseResponse
from rest_framework.pagination import PageNumberPagination class CoursesView(APIView): def get(self,request,*args,**kwargs):
result = BaseResponse()
try:
queryset = models.Course.objects.all()
# 分页
page = PageNumberPagination()
course_list = page.paginate_queryset(queryset,request,self) # 分页之后的结果执行序列化
# 分页之后必须在序列化类中加上:instance=course_list
ser = course.CourseSerializers(instance=course_list,many=True)
# ser_obj = course.CourseSerializers(queryset,many=True) result.data = ser.data
# result.data = ser_obj.data
except Exception as e:
result.code = 500
result.error = "无法获取数据"
return Response(result.dict) class CourseDetailView(APIView):
def get(self,request,pk,*args,**kwargs):
result = BaseResponse()
try:
course_obj = models.Course.objects.get(id=pk)
ser_obj = course.CourseSerializers(instance=course_obj)
result.data = ser_obj.data
except Exception as e:
result.code = 500
result.error = "无法获取数据" return Response(result.dict)
views
# from rest_framework.viewsets import ModelViewSet
from rest_framework import serializers
from api import models class CourseSerializers(serializers.ModelSerializer):
level = serializers.CharField(source="get_level_display")
class Meta:
model = models.Course
fields = "__all__"
depth = 5 class DegreeSerializers(serializers.ModelSerializer):
teacher_name = serializers.SerializerMethodField()
# teacher_name = serializers.CharField(source="teachers.")
class Meta:
model = models.DegreeCourse
fields = ["name","teacher_name"] def get_teacher_name(self,row):
teacher_list = row.teachers.all()
return [{"name": i.name } for i in teacher_list] class DegreeScholarSerializers(serializers.ModelSerializer):
# scholar = serializers.CharField(source="scholarship_set.all")
scholar = serializers.SerializerMethodField()
class Meta:
model = models.DegreeCourse
fields = ["name","scholar"] def get_scholar(self,row):
scholar_list = row.scholarship_set.all()
return [{"scholar": i.value} for i in scholar_list] class DegreeMokuaiSerializers(serializers.ModelSerializer):
# degree_mokuai = serializers.CharField(source="")
# print(111)
class Meta:
model = models.DegreeCourse
fields = ["name"]
# fields = "__all__" class Course_Serializers(serializers.ModelSerializer):
level = serializers.CharField(source="get_level_display")
why_study = serializers.CharField(source="coursedetail.why_study")
what_to_study_brief = serializers.CharField(source="coursedetail.what_to_study_brief")
recommend_courses = serializers.SerializerMethodField()
class Meta:
model = models.Course
fields = ["name","level","why_study","what_to_study_brief","recommend_courses"] def get_recommend_courses(self,row):
recomment_list = row.coursedetail.recommend_courses.all()
return [{"id":item.id,"name":item.name} for item in recomment_list] class CourseQuestionSerializer(serializers.ModelSerializer):
# question = serializers.CharField(source="asked_question.all")
question = serializers.SerializerMethodField()
class Meta:
model = models.Course fields = ["name","question"] def get_question(self,row):
question_list = row.asked_question.all()
return [{"question":i.question,"answer":i.answer} for i in question_list] class CourseOutlineSerializers(serializers.ModelSerializer):
courseoutline = serializers.SerializerMethodField()
class Meta:
model = models.Course
fields = ["name","courseoutline"]
# fields = "__all__" def get_courseoutline(self,row):
outline_list = row.coursedetail.courseoutline_set.all()
return [{"courseoutline":i.title,"content":i.content} for i in outline_list] class CourseChapterSerializers(serializers.ModelSerializer):
course_chapter = serializers.SerializerMethodField() class Meta:
model = models.Course
fields = ["name","course_chapter"] def get_course_chapter(self,row):
course_chapter_list = row.coursechapters.all()
return [{"chapter": i.name} for i in course_chapter_list]
serializers
版本2:
urls:
from django.conf.urls import url
from api.views import course
from api import views urlpatterns = [
# 如果as_view()里面要传参数的话,前提视图CBV必须继承 ViewSetMixin ,这样才能往as_view()中传入参数。
# 键值对的形式,表明了各请求方式对应的方法,所以特定的请求方式,便可执行相应的方法。
# 如果as_view()里写了相应的键值对,在视图CBV中必须写出相应的方法。 url(r'courses/$',course.CoursesView.as_view({'get':'list','post':'create'})), url(r'courses/(?P<pk>\d+)/$',course.CoursesView.as_view({'get':'retrieve','put':'update','delete':'destroy'}))
]
views:
from django.shortcuts import HttpResponse
from rest_framework.views import APIView
from rest_framework.versioning import URLPathVersioning
from rest_framework.response import Response
from api.serializers import course
from api import models
from api.utils.response import BaseResponse
from rest_framework.pagination import PageNumberPagination
from rest_framework.viewsets import ViewSetMixin # 继承ViewSetMixin
class CoursesView(ViewSetMixin,APIView):
def list(self,request,*args,**kwargs):
result = BaseResponse()
try:
# 从数据库中获取数据
queryset = models.Course.objects.all()
ser_obj = course.CourseSerializers(queryset,many=True) result.data = ser_obj.data
except Exception as e:
result.code = 500
result.error = "无法获取数据"
return Response(result.dict) def create(self,request,*args,**kwargs):
'''
post方式,增加
:param request:
:param args:
:param kwargs:
:return:
'''
def retrieve(self,request,pk,*args,**kwargs):
'''
详细显示
:param request:
:param pk:
:param args:
:param kwargs:
:return:
'''
result = BaseResponse()
try:
course_obj = models.Course.objects.get(id=pk)
ser_obj = course.CourseSerializers(instance=course_obj)
# print(ser_obj)
result.data = ser_obj.data
# print(result.data)
except Exception as e:
result.code = 500
result.error = "无法获取数据"
return Response(result.dict) def update(self,pk,*args,**kwargs):
'''
put,更改
:param pk:
:param args:
:param kwargs:
:return:
''' def destroy(self,pk,*args,**kwargs):
'''
delete ,删除
:param pk:
:param args:
:param kwargs:
:return:
'''
版本3:
urls:
from django.conf.urls import url
from api.views import course
from api import views urlpatterns = [
# 如果as_view()里面要传参数的话,前提视图CBV必须继承 ViewSetMixin ,这样才能往as_view()中传入参数。
# 键值对的形式,表明了各请求方式对应的方法,所以特定的请求方式,便可执行相应的方法。
# 如果as_view()里写了相应的键值对,在视图CBV中必须写出相应的方法。 url(r'courses/$',course.CoursesView.as_view({'get':'list'})), url(r'courses/(?P<pk>\d+)/$',course.CoursesView.as_view({'get':'retrieve'}))
]
views:
from django.shortcuts import HttpResponse
from rest_framework.views import APIView
from rest_framework.versioning import URLPathVersioning
from rest_framework.response import Response
from api.serializers import course
from api import models
from api.utils.response import BaseResponse
from rest_framework.pagination import PageNumberPagination
from rest_framework.viewsets import ViewSetMixin
from rest_framework.mixins import ListModelMixin,CreateModelMixin,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin,ListModelMixin
from rest_framework.viewsets import GenericViewSet class CoursesView(ListModelMixin,GenericViewSet):
queryset = models.Course.objects.all()
def list(self,request,*args,**kwargs):
result = BaseResponse()
try:
course_list = models.Course.objects.all()
ser_obj = course.CourseSerializers(course_list,many=True)
result.data = ser_obj.data
except Exception as e:
result.code = 500
result.error = "无法获取数据"
return Response(result.dict) def retrieve(self,request,pk,*args,**kwargs):
result = BaseResponse()
try:
course_obj = models.Course.objects.get(id=pk)
ser_obj = course.CourseSerializers(course_obj)
result.data = ser_obj.data
except Exception as e:
result.code = 500
result.error = "无法获取数据"
return Response(result.dict)
符合RESTful规范的API的更多相关文章
- yii2restful规范的api使用
说明:restful是一套优秀的接口调用规范. 使用规范: 1,安装yii2 使用composer安装 安装完 Composer,运行下面的命令来安装 Composer Asset 插件: php c ...
- [01] 浅谈RESTful风格的API
1.什么是RESTful风格的API REST,即Representational State Transfer,可以理解为"(资源的)表现层状态转化". 在网络上,我们通过浏览器 ...
- restful规范和restframework框架
什么是接口? 接口可以理解为url就是接口. 那么在其他语言里面接口也可以是约束类 restful规范是什么? RESTful是目前最流行的一种互联网软件架构.它结构清晰.符合标准.易于理解.扩展方便 ...
- django中的restful规范
基于django的原生restful规范 主路由:url.py from django.conf.urls import url, include from django.contrib import ...
- restful规范与rest_framework
django两种开发模式: 一.前后端不分离项目 二.前后端分离项目 什么是restful规范? 在前后端不分离的项目中,网页所需要的数据可以直接通过模板渲染的方式传递到前端页面,并且可以很好的支持d ...
- Restframework框架总结及restful规范
1. django rest framework框架的作用? 帮助开发者可以快速开发出遵循restful规范的API 2. django rest framework框架都有哪些组件(10)? -版本 ...
- 基于Django的Rest Framework框架的RESTful规范研究
一.什么是RESTful规范 总的来说:RESTful规范就是一个非技术,人为约定的一个面向资源的架构理念. REST与技术无关,代表的是一种软件架构风格,REST是Representational ...
- 测开大佬告诉你:如何5分钟快速创建restful风格的API接口-使用django restframework框架
一.思考❓❔ 1.创建API接口难吗? 软件测试工程师: 只测过API接口, 从没创建过 应该需要掌握一门后端开发语言和后端开发框架吧!? 脑容量有限,想想就可怕 2.如何创建API接口呢? 使用Dj ...
- RESTful 规范
RESTful 规范 前言 rest 是一种软件架构风格,如果使用的是 rest 接口,那么就可以说你的接口是 restful. rest接口是围绕''资源''展开的,利用 HTTP 的协议,其实 r ...
随机推荐
- hdu 6386 Age of Moyu (重边判断)
本来用一个map判重边结果T了, 实际上可以直接给边上打标记即可 int n, m; struct _ {int to,w,vis;}; vector<_> g[N]; int dis[N ...
- HDU 1241 Oil Deposits bfs 难度:0
http://acm.hdu.edu.cn/showproblem.php?pid=1241 对每个还未访问的点bfs,到达的点都标为一块,最后统计有多少块即可 #include <cstdio ...
- Python基础学习----公共方法及运算符
# 公共方法:在python高级数据类型通用的方法 # 常见的:max() min() len() del() # 列表 list=[1,2,3] print(len(list)) print(min ...
- node 使用范围 和 node的优势 (为什么 创业公司 选择的不是 java php ruby 等)
链接 一些国外大公司 范围: 第一: 希望合并后台多个接口 成为一个接口, 或者频繁改动接口 相关, 比如数据 和数据格式之类, 后台难以配合, 这里可以使用node作为后台的应用层调用其他接口 ...
- 干掉某个用户的所有进程 ---slay和kill
要杀掉指定进程,你可以: 1.sudo slay <name> 知道进程名字即可 2.kill[参数][进程号] 知道进程ID即可 用‘slay’干掉某个用户的所有进程 slay 是Ch ...
- .NET 中创建支持集合初始化器的类型
对象初始化器和集合初始化器只是语法糖,但是能让你的代码看起来更加清晰.至少能让对象初始化的代码和其他业务执行的代码分开,可读性会好一些. 本文将编写一个类型,可以使用集合初始化器构造这个类型.不只是添 ...
- .NET/C# 使用反射注册事件
使用反射,我们可以很容易地在运行时调用一些编译时无法确定的属性.方法等.那么如何注册事件呢? 本文将介绍如何使用反射注册事件. 本文内容 不使用反射 使用反射 安全地使用反射 参考资料 不使用反射 例 ...
- 《DSP using MATLAB》示例 Example 9.11
代码: %% ------------------------------------------------------------------------ %% Output Info about ...
- 前后端分离之让前端开发脱离接口束缚(mock)
情景: 领导:小吴啊,最近在忙什么啊? 前吴:(心想:我擦勒,难道划水被领导发现了?也不能怪我啊,后台的哥们接口还没给呢,但要是实话实说不就对不起后台哥们了吗?) ...
- 【liunx】nslookup命令
“nslookup”域名解析是什么? 假设我们要开个网站,首先我们要去提供域名申请的机构申请域名,然后绑定一个IP地址, 域名比较容易记忆,不像IP地址都是数字,申请完域名,绑定域名,DNS就写入域名 ...