前置基础知识
web开发的两种模式
前后端不分离前后端分离1. 前后端不分离
完整的html页面是在后端生成的,后端给前端返回完整的页面,前端只是进行展示,前端与后端的耦合度很高。
缺点:只适用于纯网页的应用。
优点:有利于网站的SEO优化
2. 前后端分离
完整的html页面是在前端生成的,后端只给前端返回所需的数据,前端将数据填充在页面上,前端与后端的耦合度很低。
优点:可以对接不同类型的客户端。
缺点:不利于SEO优化
3.API: 在前后端分离开发模式中,我们通常将后端开发的每个视图都称为一个接口或者API。
4.RESTful设计风格
统一的接口设计方式就是普遍采用的RESTful API设计风格
Restful风格设计-关键点
- URL地址尽量使用名词复数,不要使用动词。
- 访问同一个URL地址,采用不同的请求方式,代表要执行不同的操作。(GET)获取 POST(新增) PUT(修改)DELETE(删除) 不常用:PATCH(修改) HEAD(只返回请求头没有请求体) OPTIONS(获取信息)
- 过滤参数可以放在查询字符串中。常见的参数:
?limit=10:指定返回记录的数量?offset=10:指定返回记录的开始位置。?page=2&pagesize=100:指定第几页,以及每页的记录数。?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。
- 针对不同操作,服务器向用户返回不同的响应数据。一般遵循以下规范:
1. 获取一组数据,返回一组数据2. 获取指定数据,返回指定数据3. 新增数据,返回新增的数据4. 修改数据,返回修改的数据5. 删除数据,返回空
- 服务器返回的响应数据格式,应该尽量使用JSON。
- 响应状态码,服务器向客户端返回的状态码和提示信息,常见的状态码如下:
200 OK - [GET/PUT]:服务器成功返回用户请求的数据201 CREATED - [POST]:用户新建数据成功。204 NO CONTENT - [DELETE]:用户删除数据成功。400 INVALID REQUEST - [POST/PUT]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。。500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
了解:
- 域名:使用专有域名
- 版本:将版本信息放在url地址
- 错误:将错误信息返回
- 在访问api接口时,将和接口相关的其他API接口的地址也在响应数据中返回
使用Django开发REST API
需求: 设计一套符合RestAPI风格的接口,提供以下5个接口: 1. 获取所有直播间数据:GET /lives/ 2. 新增一本直播间数据:POST /lives/ 3. 获取指定的直播间数据(根据id):GET /lives/(?Pd+)/ 4. 修改指定的直播间数据(根据id):PUT /lives/(?Pd+)/ 5. 删除指定的直播间数据(根据id):DELETE /lives/(?Pd+)/
模型类定义
# models.pyclass LiveInfo(models.Model): live_id = models.IntegerField(verbose_name='直播间号') live_streamer = models.CharField(max_length=20, verbose_name='主播名字') live_title = models.CharField(max_length=30, verbose_name='直播间标题') live_pop = models.IntegerField(default=0, verbose_name='人气') live_content = models.CharField(default='未设定', max_length=20, verbose_name='直播类型') is_delete = models.BooleanField(default=False, verbose_name='删除标记') class Meta: db_table = 'tb_lives' verbose_name = '直播间' verbose_name_plural = verbose_name def __str__(self): return self.live_streamer
views.py文件中定义视图实现API接口:
class LiveListView(View): def get(self, request): """获取所有直播间""" lives = LiveInfo.objects.all() lives_list = [] for live in lives: lives_list.append({ 'live_id': live.live_id, 'live_streamer': live.live_streamer, 'live_title': live.live_title, 'live_pop': live.live_pop, 'live_content': live.live_content }) return JsonResponse(lives_list, safe=False) def post(self, request): """新增直播间""" passclass LiveDetailView(View): def get(self, request, pk): """查询一间直播间信息""" pass def put(self, request, pk): """修改直播间信息""" pass def delete(self, request, pk): """删除直播间""" pass