文章

10. 使用Django开发RESTFUL API

REST(Representational State Transfer), 一套客户端与服务器进行交互的规则

Resources

可以理解为能够通过URL访问的对象, 比如Product, Collection等.

比如:

http://your.url/products
http://your.url/products/1
http://your.url/products/1/reviews
http://your.url/products/1/reviews/1
...

当客户端访问这些URL的时候, 后台会根据请求的URL以HTML, XML, JSON等呈现形式返回对应的数据.

HTTP method

GET: 获取数据 POST: 创建数据 PUT: 更新数据 PATCH: 部分更新 DELETE: 删除数据

例如创建一个Product, 可以发送:

1
2
3
4
5
6
7
POST /products

    {
        "title": "new product",
        "price": 0.99,
        ...
    }

更新某个Product的数据, 则可以发送:

1
2
3
4
5
6
PATCH /products/1

    {
        "price": 1.99,
        ...
    }

安装 djangorestframework

1
pipenv install djangorestframework

配置app, 在project/settings.py文件中, 添加INSTALLED_APP配置:

1
2
3
4
5
6
7
8
9
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
]

创建 API Views

store app为例, 在 store/views.py 文件中创建方法:

1
2
3
4
5
6
7
from django.shortcuts import render
from django.http import HttpResponse


def product_list(request):
    return HttpResponse("ok")

同时修改 store/urls.py 文件:

1
2
3
4
5
6
7
from django.urls import path, include
from . import views

urlpatterns = [
    path('', views.index),
    path('products/', views.product_list)
]

最后在 project/urls.py 中加入app的对应配置:

1
2
3
4
urlpatterns = [
    path('admin/', admin.site.urls),
    path('store/', include('store.urls'))
]

此时, 通过浏览器访问 http://127.0.0.1:8000/store/products/ 如果显示ok, 那么变代表创建成功了.

使用 djangorestframework

官方文档

Django的View通过HttpRequestHttpResponse接收和返回请求, 但是这两个对象更多的是基于Django自身的MTV模式而设计的.

为了更好的使用REST API, 需要通过djangorestframework所封装的RequestResponse对象进行替换.

修改store/views.py文件

1
2
3
4
5
6
7
8
from django.shortcuts import render
from rest_framework.decorators import api_view
from rest_framework.response import Response

@api_view()  # 该装饰器替换默认的request对象为djangorestframework的request对象
def product_list(request):
    # 使用djangorestframwork的Response返回数据
    return Response("ok")

此时, 如果通过浏览器调用URL, 便会显示API的运行结果页面, 如下图所示 result 运行结果

但如果通过非浏览器调用, 就仅仅只会获得返回的json数据.

根据ID获取对应的对象

按照REST的规则, 获取全部对象的url是GET products/, 而获取指定id对象的url便应该是GET products/id.

store/views.py新建视图方法:

1
2
3
4
# store/views.py
@api_view()
def product_detail(request, product_id):
    return Response("ok")

同时更新配置文件:

1
2
3
4
5
6
7
8
9
# store/urls.py
from django.urls import path, include
from . import views

urlpatterns = [
    path('', views.index),
    path('products/', views.product_list),
    path('products/<int:product_id>/', views.product_detail)
]

视图方法中的形参名称product_id与路由配置中的形参名称必须相同, <int:product_id>限定了参数形式必须为int类型, 如果传入其他类型的参数则会跳转至404页面.

本文由作者按照 CC BY 4.0 进行授权