前面我们使用的函数视图来返回接口请求结果,函数视图有一定的局限性:
- 函数视图:
- 好理解
- 代码可读性与复用性都不好
- 类视图:
- 可读性与复用性更好
- 不同的请求方式以不同的方法呈现,结构更清晰
一、定义类视图
1、在子应用的views.py文件中定义类
导入相关模块
from django.http import HttpResponse, JsonResponse from django.views import View
2、必须继承View父类或者View子类
- 对应的请求方式对应不同的方法:
- get请求---->get方法
- post请求---->post方法
- put请求---->put方法
- delete请求---->delete方法
- 请求方法,第一个参数是类视图对象,第二个参数是请求的HttpRquest对象
class MyView(View): def get(self, request): return HttpResponse("GET请求") def post(self, request): return HttpResponse("POST请求") def put(self, requst): return HttpResponse("PUT请求") def patch(self, request): return HttpResponse("PATCH请求") def delete(self, request): return HttpResponse("DELETE请求")
3、添加类视图路由
在子应用的子路由中添加类视图路由
urlpatterns = [ # path('admin/', admin.site.urls), path('index1/', index1), re_path('^index2/$', index2), #类视图路由的定义,views.类视图.as_view(),as_view必须要加括号,不然后面运行会有报错 path('index4/',views.MyView.as_view())
注意:类视图路由的定义,views.类视图.as_view(),as_view必须要加括号,不然后面运行会有报错
调用接口:
二、通过渲染模版 ,来渲染返回数据
1、在项目的根路径中添加templates文件夹(专业版本的pycharm创建Django项目时会自动创建templates文件夹),用来存放html模版
2、在全局配置文件夹中的settings.py的TEMPLATES配置中将templates文件夹的路径添加到DIRS参数中
说明:
- DIRS列表中存放的是模版的路径,如果子应用中也有模版的话,也需要将模版文件夹的路径添加到DIRS列表中;
'APP_DIRS': True,意思是允许Django项目进入都子应用去搜索模版
3、在子应用的视图类的视图方法中调用render函数,将制定的模版名作为第二个参数
如果输入渲染模版文件时候没有智能提示,那么我们需要将渲染文件夹标记为模版文件夹。
说明:
- render函数,是将html模版渲染后返回给浏览器
- 第一个参数是HttpRequest对象,第二个参数是模版名称
index.html模版文件,通过jinja2渲染语法进行填充
打开网页后的页面展示:
三、通过 JsonResponse方法返回数据
class MyView(View): def get(self, request): data=[ {"project_name":"前程带项目", "leader":"花生", "app_name":"P2P平台项目"}, {"project_name": "测试开发平台", "leader": "高老庄", "app_name": "随便平台项目"} ] return JsonResponse(data,safe=False)
JsonResponse中第一个参数为返回的数据,第二个参数为是否打开安全模式
safe安全模式:当data为字典类型时,安全模式打不打开无所谓;
当data数据为其他类型的时候(比如字符串,嵌套字典的列表等),就要关闭安全模式,设置为safe=False,否则无法通过安全模式导致报错
接口返回为json格式数据
这样我们就可以做到前后端分离的模式,后端只需要返回json数据给前端展示在不同的端页面上(PC、app、浏览器)
四、通过HttpResponse方法返回json数据
def post(self, request): data_dict={ "name":"花生", "age":18, "other":"superman" } json_str=json.dumps(data_dict,ensure_ascii=False) return HttpResponse(json_str,content_type="application/json",status=201)
视图函数和类视图中的请求方法,一定要返回HttpResponse对象或者子类对象
a.第一个参数为content,需要传递响应数据(类型为字符串或者字节类型)
b.可以使用content_type关键字参数来指定响应报文类型(text/html、application/json等等)
c.可以使用status关键字参数来指定响应状态码