2017年10月23日

Django 實作教學 - 處理 JSON Request ( Django - Handle JSON request )

之前分享了如何透過 Django 回傳 JSON 資料,接著要利用本篇來介紹如何處理 JSON Request。( 其他 Django 相關教學可以參考本篇整理。If you want to read this article in English, you can visit here )



前置作業
在開始之前,若你還沒將環境建立起來的話,先安裝 Django 並建立專案:
# 安裝 Django
python -m pip install Django

# 查看 Django 版本
python -m django --version

# 建立 Django 專案
django-admin startproject <project-name>
專案預設結構如下:
project-name/
├── project-name
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   ├── wsgi.py


處理 JSON 請求
基本上利用 Django 處理 JSON Request 很簡單,當客戶端發起一個帶有 JSON 資料的 Request (如:POST、PUT),Django 接收到後該資料會存在於 Request 物件的 body 中。暸解後,實作起來就很簡單了,以下為範例:
import json
from django.views import View

class DummyView(View):
    def post(self, request):
        if request.body:
           # Decode data to a dict object
           json_data = json.loads(request.body)

        # Then do things with json_data ...

當然每次都要重複一樣的動作實在是有點麻煩,因此我們可以利用 View Decorator。


利用 Decorator 預先處理 JSON
利用 Django 提供的 Decorator (裝飾器) 簡化許多需要重複做的事情。首先新增 decorators.py,然後加入一個名為 dummy_json 的裝飾器,參考以下內容:
import json
from functools import wraps
from django.conf import settings
from django.http import HttpRequest, HttpResponse

def dummy_json(view_func):

    @wraps(view_func)
    def wrapper_view_func(request, *args, **kwargs):
        # Add simple validation
        if request.content_type == 'application/json':
            if request.body:
                # Decode data to a dict object
                request.json = json.loads(request.body)
            else:
                request.json = None
        return view_func(request, *args, **kwargs)
    return wrapper_view_func
完成後,之後我們就可以在 View 中直接使用 dummy_json,像這樣:
import json
from decorators import *
from django.views import View
from django.utils.decorators import method_decorator

class DummyView(View):

    @method_decorator(dummy_json)
    def post(self, request):
        json_data = request.json
        # Then do things with json_data ...



Environment :
  ・ Unix-like System
Reference :
  ・ Django

熱門文章