Django中自定義實現RESTful API

什麼是restful api

  能夠總結爲一句話:REST是全部Web應用都應該遵照的架構設計指導原則。 Representational State Transfer,翻譯是」表現層狀態轉化」。 面向資源是REST最明顯的特徵,對於同一個資源的一組不一樣的操做。REST要求,必須經過統一的接口來對資源執行各類操做。對於每一個資源只能執行一組有限的操做。(7個HTTP方法:GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS)python

Restful API設計規範

1,資源。首先是弄清楚資源的概念。資源就是網絡上的一個實體,一段文本,一張圖片或者一首歌曲。資源老是要經過一種載體來反應它的內容。JSON是如今最經常使用的資源表現形式。django

2,統一接口。RESTful風格的數據元操CRUD(create,read,update,delete)分別對應HTTP方法:GET用來獲取資源,POST用來新建資源(也能夠用於更新資源),PUT用來更新資源,DELETE用來刪除資源,這樣就統一了數據操做的接口。api

3,URI。能夠用一個URI(統一資源定位符)指向資源,即每一個URI都對應一個特定的資源。要獲取這個資源訪問它的URI就能夠,所以URI就成了每個資源的地址或識別符。通常的,每一個資源至少有一個URI與之對應,最典型的URI就是URL。restful

4,無狀態。所謂無狀態即全部的資源均可以URI定位,並且這個定位與其餘資源無關,也不會由於其餘資源的變化而變化。有狀態和無狀態的區別,舉個例子說明一下,網絡

  例如要查詢員工工資的步驟爲第一步:登陸系統。第二步:進入查詢工資的頁面。第三步:搜索該員工。第四步:點擊姓名查看工資。這樣的操做流程就是有狀態的,查詢工資的每個步驟都依賴於前一個步驟,只要前置操做不成功,後續操做就沒法執行。若是輸入一個URL就能夠獲得指定員工的工資,則這種狀況就是無狀態的,由於獲取工資不依賴於其餘資源或狀態,且這種狀況下,員工工資是一個資源,由一個URL與之對應能夠經過HTTP中的GET方法獲得資源,這就是典型的RESTful風格。架構

RESTful API其餘一些規範

1:應該將API的版本號放入URL。GET:http://www.xxx.com/v1/friend/123。或者將版本號放在HTTP頭信息中。app

2:URL中只能有名詞而不能有動詞,URL只標識資源的地址,既然是資源那就是名詞了。ide

3:若是記錄數量不少,API應該提供參數,過濾返回結果。?limit=10:指定返回記錄的數量、?page=2&per_page=100:指定第幾頁,以及每頁的記錄數。函數

  PS:我介紹的是自定義實現Django restful,固然Django中有一種更快捷、強大的方法,那就是 Django REST framework。它是python的一個模塊,經過在Django裏面的配置就能夠把app的models中的各個表實現RESTful API。
post

RESTful API的簡單實現

目錄結構

 

具體代碼

準備:先在models中建一個Person類插入一些數據。

api_v1.py:

from django.forms import model_to_dict
from django.http import QueryDict, JsonResponse
from django.views.generic import View
from app.models import *


class PersonAPI(View):
    def get(self,req):
        data = Person.objects.all()
        person = [model_to_dict(i) for i in data]
        result = {
            'code':1,
            'msg':'數據查詢到了',
            'data':person
        }
        return JsonResponse(result)

    def post(self,req):
        name = req.POST.get('name')
        age = req.POST.get('age')
        res = Person.objects.create(name = name,age = age)
        result = {
            'code':1,
            'msg':'數據建立成功',
            'data':model_to_dict(res)
        }
        return JsonResponse(result)

    def delete(self,req):
        params = QueryDict(req.body)
        id = int(params.get('s_id'))
        res = Person.objects.get(pk=id)
        res.delete()
        result = {
            'code':1,
            'msg':'數據刪除成功',
            'data':id
        }
        return JsonResponse(result)
api_v1.py

  當請求的方法不一樣時,會自動根據請求的方法分發到不一樣的函數方法來執行相應的操做。我這裏只寫了三種方法,要是是這三種之外的方法訪問的話,會報405錯誤,說請求方法不被容許。

urls_api_v1.py:

from django.conf.urls import url
from app.api_v1 import *

urlpatterns = [
    url('^personapi$',PersonAPI.as_view()),
]
urls_api_v1.py

urls.py:

from django.conf.urls import url,include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^api/v1/', include('app.urls_api_v1')),
]
urls.py
相關文章
相關標籤/搜索