什麼是RESTful
RESTful是一種設計思想,一種風格。python
RESTful主要包括 資源 和 對資源的操做。git
資源: 對實體的抽象,圖書、音樂、電影、學生等都屬於資源。數據庫
對資源的操做:django
========== ===================== ================================== 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風格接口
要實現的接口:json
========== ===================== ================================================ 請求方法 行爲 接口地址 ========== ===================== ================================================ 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 ========== ====================== ================================================
操做步驟:api
-
建立項目(假設,你已經熟練掌握如何建立項目),項目目錄結構以下:安全
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.pyrestful
# 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.pyapp
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.pyide
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