这是我参与更文挑战的第2天,活动详情查看: 更文挑战
什么是前后端分离?为什么要前后端分离?
- 后端仅返回数据:前后端分离时,后端仅返回前端所需的数据,不再渲染HTML页面,不再控制前端的效果。
- 优点:不同前端(WEB/APP/……)可以从统一的后端获取一样的数据,进行不同处理和展示。有利于前后端分工开发,也有利于后续拓展前端方式。
- 后端API接口实现(请求方式、路径、返回等)可能风格迥异,遵循RESTful设计风格有利于统一风格(推荐而非强制要求)
RESTful API要求
(简略,非全部)
- 使用GET/POST/PUT/DELETE 请求分别对应 SELECT/CREATE/UPDATE/DELETE(查/增/改/删)的数据库操作
- 返回json数据
实现步骤
- 设置视图:为不同请求(get/post/put/delete)设置对应的同名方法
- 根据从地址取出的参数查询对应对象
- 根据不同请求及请求体中的信息进行对应操作
- 返回json数据
- 添加路由:添加对应地址,且设置需要取出的参数
1. 设置视图(views.py)
# 以实现一本书的查(get)、改(put)、删(delete)的REST接口,反馈json数据
class BookAPIView(View):
# 查询
def get(self, request, pk):
"""
获取单个图书信息
路由: GET /books/<pk>/
"""
# 根据传入的PK值,取对应书籍的对象
try:
book = BookInfo.objects.get(pk=pk)
except BookInfo.DoesNotExist:
return HttpResponse(status=404)
# 返回json数据
return JsonResponse({
'id': book.id,
'btitle': book.btitle,
})
# 修改
def put(self, request, pk):
"""
修改图书信息
路由: PUT /books/<pk>
"""
# 根据传入的PK值,取对应书籍的对象
try:
book = BookInfo.objects.get(pk=pk)
except BookInfo.DoesNotExist:
return HttpResponse(status=404)
# 将请求中的json格式转换为字典格式
json_bytes = request.body
json_str = json_bytes.decode()
book_dict = json.loads(json_str)
# 校验参数(省略)
# 更新对象并保存
book.btitle = book_dict.get('btitle')
book.save()
# 返回json数据
return JsonResponse({
'id': book.id,
'btitle': book.btitle,
})
# 删除
def delete(self, request, pk):
"""
删除图书
路由: DELETE /books/<pk>/
"""
# 根据传入的PK值,取对应书籍的对象
try:
book = BookInfo.objects.get(pk=pk)
except BookInfo.DoesNotExist:
return HttpResponse(status=404)
# 删除对象
book.delete()
# 返回操作成功(204)
return HttpResponse(status=204)
2.添加路由(urls.py)
urlpatterns = [
url(r'^books/(?P<pk>\d+)/$', views.BookAPIView.as_view())
]