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
利用 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 可以讓我們輕鬆的減少重複的程式碼,而且 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.