接口
RESTful规范
restful规范面试总结
''' 1.url链接设计:采用https方式,有api关键字,有版本需要明确版本,请求链接用名词来表示资源,具体的操作方式采用请求方式来确定2.url响应数据设计:需要明确 状态码、错误信息、成功结果,子资源一般用子资源的接口来标注'''
原生简易书写TESTful规范接口
# 路由层
from app
import views
urlpatterns =
[
url(r'^books/', views.books),
]
# 视图层
from django.http
import JsonResponse
book_list = [{
'id': 1,
'name':
'红楼梦'}, {
'id': 2,
'name':
'水浒传'}]
def books(request):
if request.method ==
"GET":
if 'ak' not in request.GET:
return JsonResponse({
'status':
'101',
'msg':
'ak不存在'
}, json_dumps_params={
'ensure_ascii': False})
ak = request.GET.get(
'ak')
if ak !=
'123abc':
return JsonResponse({
'status':
'200',
'msg':
'ak非法'
}, json_dumps_params={
'ensure_ascii': False})
return JsonResponse({
'status':
'0',
'msg':
'ok',
'results': book_list
}, json_dumps_params={
'ensure_ascii': False})
if request.method ==
'POST':
name = request.POST.get(
'name')
if not name:
return JsonResponse({
'status':
'101',
'msg':
'参数不合法',
}, json_dumps_params={
'ensure_ascii': False})
id = len(book_list) + 1
book = {
'id': id,
'name': name}
book_list.append(book)
return JsonResponse({
'status':
'0',
'msg':
'ok',
'results': book
}, json_dumps_params={
'ensure_ascii': False})
cbv流程
"""1) as_view() -- Users.as_view()本质拿到view(request, *args, **kwargs)函数对象2)view(request, *args, **kwargs) -- return self.dispatch(request, *args, **kwargs)来完成请求的反射3)dispatch(request, *args, **kwargs) -- 完成具体的请求响应的分发# 注:重写dispatch是可以在分发响应时,加入其它逻辑限制"""
drf安装
drf的安装步骤
drf具体的使用
# 路由层
from app
import views
urlpatterns =
[
url(r'^teachers/', views.Teachers.as_view()),
]
# 视图层
from rest_framework.views
import APIView
from rest_framework.response
import Response
class Teachers(APIView):
def get(self, request, *args, **
kwargs):
salary = request.GET.get(
'salary')
print(salary)
return Response({
'status': 2
,
'msg':
'get请求成功',
})
# 前台发送数据的方式:formdate | urlencoded | json
# drf的request都对其二次封装解析到request.data中
def post(self, request, *args, **
kwargs):
salary = request.data.get(
'salary')
print(salary)
return Response({
'status': 2
,
'msg':
'post请求成功',
})
drf 的 请求源码分析
# as_view()
# 核心走了父类as_view
view = super(APIView, cls).as_view(**
initkwargs)
# 返回的是局部禁用csrf认证的view视图函数
return csrf_exempt(view)
# dispatch(self, request, *args, **kwargs)
# 二次封装request对象
request = self.initialize_request(request, *args, **
kwargs)
# 自定义request规则
self.initial(request, *args, **
kwargs)
# initialize_request(self, request, *args, **kwargs)
# 原生request封装在request._request
# initial(self, request, *args, **kwargs)
# 认证
self.perform_authentication(request)
# 权限
self.check_permissions(request)
# 频率
self.check_throttles(request)
# 在drf的request.py的模块中,对django的request进行二次封装
def __getattr__(self, attr):
try:
return getattr(self._request, attr)
except AttributeError:
return self.
__getattribute__(attr)
# 完成对django的request完全兼容
drf序列化
# models.py
class Students(models.Model):
name = models.CharField(max_length=32
)
age =
models.IntegerField()
gender = models.CharField(max_length=8
)
def __str__(self):
return 'Student: %s' %
self.name
# 自定义序列化类:为具体的类提供序列化
# my_serializer.py
from rest_framework
import serializers
class StudentSerializer(serializers.Serializer):
# 1.如果没有source引入models的字段名,序列化字段名必须同models的字段名
# 2.如果有source引入models的字段名,序列化字段名必须不同于models的字段名,目的是对外隐藏数据库的字段名
id =
serializers.IntegerField()
stu_name = serializers.CharField(source=
'name')
age =
serializers.IntegerField()
gender =
serializers.CharField()
# views.py
from app
import models
from app.my_serializer
import StudentSerializer
class Students(APIView):
def get(self, request, *args, **
kwargs):
stus =
models.Students.objects.all()
# 需要序列化多个对象,需要明确many=True
stu_ser = StudentSerializer(stus, many=
True)
print(stus)
return Response({
'status': 0,
'msg':
'ok',
'results': stu_ser.data
})
# urls.py
from app
import views
urlpatterns =
[
url(r'^students/', views.Students.as_view()),
]
序列化
转载于:https://www.cnblogs.com/98WDJ/p/10870603.html
相关资源:垃圾分类数据集及代码