Django 中 REST API 的設計

王海波發表於2017-01-06

最近學習了REST方面的知識,瞭解了REST 的基礎、API 的設計規則等等。

在Django中,不需要自己去設計每一個API,因為djangorestframwork幫我們做了一些工作。其實設計Django REST API的框架不少,但是djangorestframwork風格更像Django,與django的整合度更高,更易上手。該框架分為model, serializer, views三層,支援許可權許可等功能。

現在就邊做邊學習這方面的知識。 首先是準備工作: 1、安裝djangorestframwork pip install djangorestframework;
2、安裝django-filter;

配置:

  1. 在INSTALLED_APPS中新增: ‘rest_framwork’
  2. 設定 REST_FRAMEWORK

在上面設定了許可權,設定了結果分頁,設定了過濾器。

上面配置完成,開始寫程式碼。

一、Model就是資料庫定義的模型本身 Model有article,user,category三個

User Model是Django自帶的Model。

二、序列化Serializer

摘自官網: Serializers allow complex data such as querysets and model instances to be converted to native Python datatypes that can then be easily rendered into JSON, XML or other content types. Serializers also provide deserialization, allowing parsed data to be converted back into complex types, after first validating the incoming data.
The serializers in REST framework work very similarly to Django’s Form and ModelForm classes. We provide a Serializer class which gives you a powerful, generic way to control the output of your responses, as well as a ModelSerializer class which provides a useful shortcut for creating serializers that deal with model instances and querysets.

從以上文字可以看出,serializer的目的是將查詢集或模型例項轉化為Python資料型別,從而很方便得轉變為Json,XML等多種格式。

我的專案中的Serializer設計:

在上面每個序列器都指定了Model,這樣會自動生成序列化欄位,這樣比較方便。 在ArticleSerializer中,加入了author和category的序列化,這樣做是因為當我們瀏覽article的資訊時。會直接顯示author和category的具體資訊,否則就只是author和category的id。

三、View:
主要使用viewset。和route ViewSet為我們提供了預設的URL結構, 使得我們能更專注於API本身。而Route能夠輕鬆的幫我們實現URL和ViewSet之間的關聯。 原始碼:

上面使用了ModelSet是有原因的,因為它自動提供delete,create,update,list等操作,即增刪該查等操作。

其次說下filter,一般都用預設的DjangoFilterBackend,此外rest-framework 提供了幾個原生的 filter:

SearchFilter

filter_backends = (filters.SearchFilter,) search_fields = (‘username’, ’email’) # 指定搜尋的域

請求 http://example.com/api/users?search=russell。

OrderingFilter

filter_backends = (filters.OrderingFilter,) ordering_fields = (‘username’, ’email’)

請求 http://example.com/api/users?ordering=account,-username。

再說下許可權。

rest_framework 中提供了七種許可權

把原始碼拿出來:

其實還是比較理解的,首先判斷使用者,如果滿足就返回True。要注意我們在Viewset中設定的許可權必須是一個元祖,否則會出現錯誤。正確寫法:permission_classes = (IsAdminUser,)。元祖裡可以寫多個permission,但注意,元祖裡的屬於與的關係,即任何一個不滿足都不行,而不是或的關係,具體可見如下原始碼:

當然,除了預設的許可權我們也可以自定義許可權:

這裡要注意,對於一個request,會優先檢查permission的has_permission方法,它是對每一個request進行檢查。然後才檢查has_object_permission,這是對每一個object進行檢查。兩者的區別是前者是對每一個request請求設定的許可權,後者是對資料庫條目進行許可權設定的,但我理解她也包含了對request的控制。

如果不滿足許可權要求,則返回403或者401等錯誤程式碼。

然後定義路由:

有幾點說明:
1、如果在viewset設定了許可權,那麼必須得帶上登入使用者名稱,密碼等資訊;
2、如果沒有設定許可權,那不帶使用者名稱可以使用GET方法,但是其他操作如POST,PUT,DELETE等,也要帶上登入使用者名稱,密碼等資訊;

測試:
curl http://localhost:8080/api/categoriese/10/?format=json(預設為get)
curl http://localhost:8080/api/categorieses/
curl -u username:password -X PUT -d “name=dwd&alias=dw” http://localhost:8080/api/categories/10/
curl -u username:password -X delete http://localhost:8080/api/categoriese/10/
curl -u username:password -X POST -d “name=dwd&alias=dw” http://localhost:8080/api/categories/10/

打賞支援我寫出更多好文章,謝謝!

打賞作者

打賞支援我寫出更多好文章,謝謝!

任選一種支付方式

Django 中 REST API 的設計 Django 中 REST API 的設計

相關文章