Django - 處理 JSON 請求

Oct 23, 2017 Djnago English

在之前的文章中,我介紹了如何透過 Django 回傳 JSON 資料。 今天,讓我們繼續對付 JSON 吧!在本篇文章中,我將介紹如何透過 Django 處理 JSON 請求 (如:POST、PUT 等請求)。



前置準備

若你還未將環境設定好,你可以使用以下指令快速建立專案:

# 安裝 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 請求相當簡單、直覺。每當客戶端發送一個 JSON 請求,Django 接收 Request 時會建立一個 HttpRequest 物件來儲存所有關於此請求的資料。那 JSON 資料是存放在哪?沒錯,就是存放在 HttpRequest 的屬性 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)

            # Do things with json_data ...

現在你已經知道如何取得 JSON 資料,但每次都要重複加入相同的程式碼實在是有一點麻煩。所以我們可以利用 Decorator (裝飾器) 來取代這些重複的程式碼。

使用 Decorator

使用 Decorator 可以讓我們輕鬆的減少重複的程式碼,而且 Django 也提供了一個相關有用的工具:django.utils.decorators。接著讓我來示範如何使用它,首先建立一個名為 decorators.py 的 Python 檔案,然後將以下內容加入它:

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 or your own validation rule
        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

如你所見,我定義了一個名為 dummy_json 的 Decorator,然後我們可以在 view.py 中使用它:

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 ...

現在,你可以開始使用客製的 Decorator 來處理 JSON 請求。


你也可能會喜歡:




若對於文章內容有任何建議與指正,非常歡迎你告訴我或者與我一起討論 ! :)

zeckli.devforgalaxy@gmail.com   © 2015-2019 zeckli, thanks to Jekyll and GitHub.