resfu规范:
1 名词(不要用get_book)
2 /books/1 通过请求方式,get请求,通过id拿书的信息
/books/ post请求,生成一本书的信息
put请求 更新
delete请求 删除
3 建议用https
4 版本
方式一 - http://www.baidu.com/api/v1/....
方式二 -http://www.baidu.com/api/books/?version=v1
5 域名:---api.baidu.com/.....(会发生跨域问题)
---http://www.baidu.com/api/
6 状态码:--自己请求的状态码
---自己定义的状态码(最好是数字)
7 错误信息: msg
8 返回结果带连接(很少)
9 过滤:http://www.baidu.com/api/v1/book/?page=10
10 返回结果:修改,新增---返回整个数据
删除---返回空
查询---查询结果
APIView
---重写了View
---as_view()方法
---dispatch()方法
Django请求生命周期:
--浏览器用户发请求---->ngix(代理静态文件)+uwsgi(socket服务器)--->中间件--->urls--(APIView加了一些东西)-->视图函数---(拿数据,拿模板)返回
序列化组件(核心):
--Serializer类
---class Book(Serializer类):
title=CharField() 不写sorce属性要跟models里属性对应
xx=CharField(source=title) source --既可以是字段,又可以是方法
authors=SerializerMethodField() --结合下面的方法来获取对应的值
def get_ss(self,obj): obj 是一个book对象
return
--ModelSerializer类
class Book(ModelSerializer类):
class Meta:
model=表
fields='__all__'
#fields=['title','id'] --元组或者列表都可以
#exclude=('title','id') 除了谁之外(不能同时跟fields同时用)
depth=1 #获取的深度控制,写几往里拿几层,层数越多,响应越慢,官方建议0--10之间,个人建议最多3层
#获取作者详细信息
authors=SerializerMethodField()
def get_ss(self,obj): obj 是一个book对象
return
数据校验功能:
-全局钩子函数
def validate(self,attrs):
title=attrs.get('title')
-局部钩子函数
def validate_title(self,attrs)
#对attrs进行判断
-is_valid (校验通过就是true)
ser.save() 保存,更新,都可以----ser必须是继承 ModelSerializer类 的对象
Forms
全局钩子:
def clean(self):
self.clean_data.get('pwd')
解析器:
request.data
---全局配置
REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': ['rest_framework.parsers.JSONParser', 'rest_framework.parsers.FormParser']
}
---局部配置
class BookView(APIView):
parser_classes = [JSONParser,]
视图层:(培养封装代码的能力)
方式一:最多
增删查改自己写,最原始的方式
方式二:较多
class Publish(GenericAPIView,mixins.CreateModelMixin,mixins.ListModelMixin):
get方法
#加自己的逻辑
self.list()
post方法
方式三: class Publish(ListCreateAPIView):
-ListCreateAPIView继承了:CreateModelMixin,ListModelMixin,GenericAPIView
RetrieveUpdateDestroyAPIView
-RetrieveUpdateDestroyAPIView继成了:
方式四:(较多)
class Publish(ModelViewSet):
queryset = models.Publish.objects.all()
serializer_class = PublishSer
urls:
url(r'^publish/$', views.Publish.as_view({'get':'list','post':'create'})),
url(r'^publish/(?P<pk>\d+)', views.Publish.as_view({'get':'retrieve','put':'update','delete':'destroy'})),
路由:
1 原始方式(这种方式用的最多)
# url(r'^publish/$', views.Publish.as_view()),
# url(r'^publish/(?P<pk>\d+)', views.PublishDetail.as_view()),
2 半自动路由(需要继承ModelViewSet)
url(r'^publish/$', views.Publish.as_view({'get':'list','post':'create'})),
url(r'^publish/(?P<pk>\d+)', views.Publish.as_view({'get':'retrieve','put':'update','delete':'destroy'})),
3 全自动(需要继承ModelViewSet)
1 from rest_framework import routers
2 router=routers.DefaultRouter()
3 router.register('publish',views.Publish) 第一个参数:路由的地址 第二个参数:视图函数
4 urlpatterns = [
url(r'api/v1/', include(router.urls)),
]
^publish/$ [name='publish-list']
^publish\.(?P<format>[a-z0-9]+)/?$ [name='publish-list']
^publish/(?P<pk>[^/.]+)/$ [name='publish-detail']
^publish/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$ [name='publish-detail']