什么是RESTful
RESTful是一种设计思想,一种风格。
RESTful主要包括 资源 和 对资源的操作。
资源: 对实体的抽象,图书、音乐、电影、学生等都属于资源。
对资源的操作:
========== ===================== ==================================
HTTP 方法 行为 示例
========== ===================== ==================================
GET 获取资源的信息 http://example.com/api/students
GET 获取某个特定资源的信息 http://example.com/api/students/123
POST 创建新资源 http://example.com/api/students
PUT 更新资源 http://example.com/api/students/123
DELETE 删除资源 http://example.com/api/students/123
========== ====================== ==================================
使用Django开发一个简单的RESTful风格接口
要实现的接口:
========== ===================== ================================================
请求方法 行为 接口地址
========== ===================== ================================================
GET 获取资源的信息 http://127.0.0.1:8000/todo/api/v1.0/tasks
GET 获取某个特定资源的信息 http://127.0.0.1:8000/todo/api/v1.0/tasks/123
POST 创建新资源 http://127.0.0.1:8000/todo/api/v1.0/tasks
PUT 更新资源 http://127.0.0.1:8000/todo/api/v1.0/tasks/123
DELETE 删除资源 http://127.0.0.1:8000/todo/api/v1.0/tasks/123
========== ====================== ================================================
操作步骤:
-
创建项目(假设,你已经熟练掌握如何创建项目),项目目录结构如下:
D:/writing/django_restuful -- 项目所在目录 │ manage.py -- Django项目的管理文件 │ ├─.idea --使用的是Pycharm创建,.idea是PyCharm的项目配置文件 │ │ django_restful.iml │ │ misc.xml │ │ modules.xml │ │ workspace.xml │ │ │ └─inspectionProfiles │ profiles_settings.xml │ ├─api --创建的一个app │ │ admin.py │ │ apps.py │ │ models.py │ │ tests.py │ │ views.py │ │ __init__.py │ │ │ └─migrations --每个app都有一个migrations包 │ __init__.py │ ├─django_restful --每个项目都有一个和项目名一致的包,包含配置文件、wsgi、跟路由urls │ │ settings.py │ │ urls.py │ │ wsgi.py │ │ __init__.py │ │ │ └─__pycache__ │ settings.cpython-37.pyc │ __init__.cpython-37.pyc
-
编写api/views.py
# coding:utf8 from django.views import View from django.http import JsonResponse import json # 为了专注于演示接口的开发,这里没有使用数据库,只是用了一个list作为存储容器 tasks = [ { 'id': 1, 'title': u'Buy groceries', 'done': False }, { 'id': 2, 'title': u'Learn Python', 'done': False } ] class TodoList(View): def get(self, request): """获取所有task""" return JsonResponse(tasks, safe=False) def post(self, request): """添加一个task""" data = json.loads(request.body) try: task = { "id": tasks[-1]['id'] + 1, 'title': data['title'], 'done': False } tasks.append(task) except Exception as err: return JsonResponse({{"errcode": 4001, "errmsg": "任务添加失败"}}) else: return JsonResponse(task, safe=False) class Todo(View): def get(self, request, task_id): """获得某个task""" task_id = int(task_id) task = list(filter(lambda t: t['id'] == task_id, tasks)) if not task: return JsonResponse({"code": 400}) return JsonResponse({'task': task[0]}) def delete(self, request, task_id): """删除某个task""" task_id = int(task_id) task = list(filter(lambda t: t['id'] == task_id, tasks)) if task: tasks.remove(task) return JsonResponse({'result': True}) def put(self, request, task_id): """修改某个task""" task_id = int(task_id) data = json.loads(request.body) task = list(filter(lambda t: t['id'] == task_id, tasks)) if len(task) == 0: return JsonResponse({"code": 400}) if not data: return JsonResponse({"code": 400}) if data.get('title') is None: return JsonResponse({"code": 400}) if data.get('done') and type(data['done']) is not bool: return JsonResponse({"code": 400}) task[0]['title'] = data.get('title', task[0]['title']) task[0]['done'] = data.get('done', task[0]['done']) return JsonResponse({'task': task[0]})
-
编写api/urls.py
from api import views from django.urls import re_path urlpatterns = [ re_path('^tasks/$', views.TodoList.as_view(), name='todolist'), re_path('^tasks/(?P<task_id>d+)/$', views.Todo.as_view(), name='todo'), ]
-
编写django_restful/urls.py
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('todo/api/v1.0/', include('api.urls')), ]
-
编写django_restful/settings.py
MIDDLEWARE = [ ... 'django.middleware.common.CommonMiddleware', # 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', .... ]
注意:这里为了测试的方便,禁用了csrf,在实际项目中不要禁用,禁用的话不安全。Django 关于CSRF的问题不属于本专题,有时间单独介绍CSRF。
完整代码
https://gitee.com/sunwenquan/django_restful/repository/archive/v1.0.0
说明
除了用Django的类视图写接口,还可以用DRF写,详细可参考视频:https://v.douyu.com/show/0zZVvPRzbOmMO4E2