Python RESTful接口開發02

什麼是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

  1. 建立項目(假設,你已經熟練掌握如何建立項目),項目目錄結構以下:安全

    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
  2. 編寫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]})
  3. 編寫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'),
    ]
  4. 編寫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')),
    ]
  5. 編寫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

相關文章
相關標籤/搜索