什么是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\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。
完整代码
说明