视图函数
作用
用于返回给前端数据
详解
python
def list(request):
"""
1.普通的视图函数 request是HttpRequest 函数
2.且必须用request.GET|request.POST 指定方法是什么方法
3.返回值不能用 rest_framework包下的Response 必须是
:param request:
:return:
"""
assert isinstance(request, HttpRequest)
page = request.GET.get("page", default=1)
page_size = request.GET.get("page_size", default=10)
objs = Student.objects.all()
# 分页器实现分页
paginator = Paginator(objs, page_size) # 构建分页器
current_page_objs = paginator.get_page(page).object_list # 当前页的数据
# 反序列化为json
data_list = StudentSerializer(current_page_objs, many=True).data
res = {
"status_code": 200,
"message": "分业查询成功",
"data": {
'items': data_list
}
}
return JsonResponse(res)
读者不需要看其他部分,只需要知道视图函数接收的是HttpRequest对象。
其属性有:
path:路径,不包含域名
method: 表示请求的方法,为str类型,值为POST, GET
encoding:数据的编码格式,默认utf-8
GET: 字典,包含get所有参数
POST:字典,POST所有参数
FILES:字典,上传文件的信息
COOKIES:字典 所有cookie对象
session:字典 表示会话
META: 字典,HTTP 头信息,比如agent,ip等
user:当前登录用户
视图函数的特点
视图函数,函数名称何以结合path达到词语达意的意思,比较灵活。比如函数名称为: list_stident(request)
则url中path('list/student', list_stident)
视图类
视图类是封装了接收前端 ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'] 方法支持的类,想要任何函数直接继承APIView 即可,这样子固定的路径下,该类自动识别前端请求类型,会自动找到对应的函数,比如前段发送POST请求,则会自动到你实现的POST中。
实际开发怎么用
一般是视图函数和视图类结合使用。视图类只提供最基本的:【POST 创建 , PUT修改, DELETE 删除 , GET 创建四个函数】至于其他的api则用视图函数达到 见路径知含义的效果。
一个无意义的demo
java
class StudentApi(APIView):
"""
1.get/put/post/delte 定义了基础视图
2.静态函数定义了 其他的功能
"""
def get(self, request):
queryset = Student.objects.all()
data_list = StudentSerializer(queryset, many=True).data
res = {
"status_code": 200,
"message": "查询成功",
"data": {
'items': data_list,
'total': len(data_list)
}
}
return Response(res)
# 创建->仅仅传入data参数
def post(self, request):
with transaction.atomic():
serializer = StudentSerializer(data=request.data)
if serializer.is_valid(raise_exception=True):
# save 中做了校验如果存在则更新 否则则是创建
instance = serializer.save()
res = {
"status_code": 200,
"message": "创建成功",
"data": {
'id': instance.id
}
}
return Response(res)
# 更新要同时传入 instance 和data
def put(self, request):
with transaction.atomic():
res_body = {
"code": 200,
"msg": "更新成功",
"data": {}
}
try:
obj = Student.objects.get(id=request.data['id'])
serializer = StudentSerializer(instance=obj, data=request.data)
if serializer.is_valid(raise_exception=True):
instance = serializer.save()
res_body["data"]["obj"] = model_to_dict(instance)
except Exception as e:
print(e)
res_body["msg"] = "更新失败:%s" % e
return Response(res_body)
def delete(self, request):
assert isinstance(request, Request)
params = request.query_params
res_body = {
"code": 200,
"msg": "删除",
"data": {}
}
try:
obj = Student.objects.get(id=params["id"])
obj.delete()
res_body["data"]["obj"] = model_to_dict(obj)
except Exception as e:
res_body["msg"] = "删除失败:%s" % e
return Response(res_body)
def list(request):
"""
1.普通的视图函数 request是HttpRequest 函数
2.且必须用request.GET|request.POST 指定方法是什么方法
3.返回值不能用 rest_framework包下的Response 必须是
:param request:
:return:
"""
assert isinstance(request, HttpRequest)
page = request.GET.get("page", default=1)
page_size = request.GET.get("page_size", default=10)
objs = Student.objects.all()
# 分页器实现分页
paginator = Paginator(objs, page_size) # 构建分页器
current_page_objs = paginator.get_page(page).object_list # 当前页的数据
# 反序列化为json
data_list = StudentSerializer(current_page_objs, many=True).data
res = {
"status_code": 200,
"message": "分业查询成功",
"data": {
'items': data_list
}
}
return JsonResponse(res)
路由定义为:
urlpatterns = [
url(r'^student$', app_view.StudentApi.as_view()),//基本增删改查
url('^student/list$', app_view.StudentApi.list) //见path知含义
]