zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Response生成注册验证码实现例子02
    Mysql 自增字段起始值auto_increment的修改方法
    elite核心库的加载方式及自动加载类库
    elite核心类库之事件类
    wamp速度缓慢的解决办法
    Dwzdialog中批量提交的问题处理
    PHP中缀表达式与逆波兰式的计算(用于工资项目等四则计算)
    PHP工资计算之逆波兰式
    elite核心类库之模板类
    PHP soap访问接口出错汇总及解决办法
  • 原文地址:https://www.cnblogs.com/tantanjishu/p/11686472.html
Copyright © 2011-2022 走看看