python restful开发_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

========== ====================== ================================================

操作步骤:

创建项目(假设,你已经熟练掌握如何创建项目),项目目录结构如下:

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。

完整代码

说明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值