Python RESTful接口开发02

什么是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
==========  ====================== ================================================

操作步骤:

  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.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]})
    
  3. 编写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'),
    ]
    
  4. 编写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')),
    ]
    
  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

原文地址:https://www.cnblogs.com/tantanjishu/p/11686472.html