Django REST Framework 快速上手
背景
這幾天正好在研究 RESTful 的方式來寫 API,然后上手 Django REST 框架。
Django REST Framework (以下簡(jiǎn)稱 DRF )是一個(gè)輕量級(jí)的庫,熟悉 Django 的話可以很容易的用它來構(gòu)建 Web API。
安裝前提
Django REST Framework 安裝需要以下前提:
- Python (2.7, 3.2, 3.3, 3.4, 3.5)
- Django (1.7+, 1.8, 1.9)
我自己的環(huán)境是:
- Python 2.7.10
- Django 1.8.2
安裝配置
安裝 DRF 需要用到 pip 命令
pip install djangorestframework
pip install markdown # Markdown support for the browsable API.
pip install django-filter # Filtering support
或者在 GitHub 上 clone 它
git clone git@github.com:tomchristie/django-rest-framework.git
接著在 Django Project 根目錄的 setting.py 文件中的 INSTALLED_APPS 加入 'rest_framework'
INSTALLED_APPS = (
...
'rest_framework',
)
如果你要使用 DRF 的 browsable API 的話,你可能還需要添加 REST 框架的登錄登出視圖 ( views ),辣么需要在 url.py 文件中加入以下代碼:
urlpatterns = [
...
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]
注: 這個(gè) URL 地址可以是任意的,但是必須 include 'rest_framework.urls' 和 namespace='rest_framework' 。
舉個(gè)栗子
現(xiàn)在我們來看一下一個(gè)簡(jiǎn)單的用 DRF 來構(gòu)建一個(gè)模型支持較好的 API 的栗子。
任何一個(gè)對(duì) REST 框架的全局設(shè)置都被放在 REST_FRAMEWORK 的模塊內(nèi),所以你需要在 settings.py 文件中添加以下代碼來通過 REST_FRAMEWORK 入口進(jìn)行全局設(shè)置:
REST_FRAMEWORK = {
# Use Django's standard `django.contrib.auth` permissions,
# or allow read-only access for unauthenticated users.
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
]
}
現(xiàn)在我們可以構(gòu)建 API 了,編輯 Django 項(xiàng)目根目錄的 url.py 文件:
from django.conf.urls import url, include
from django.contrib.auth.models import User
from rest_framework import routers, serializers, viewsets
# Serializers define the API representation.
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ('url', 'username', 'email', 'is_staff')
# ViewSets define the view behavior.
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
# Routers provide an easy way of automatically determining the URL conf.
router = routers.DefaultRouter()
router.register(r'users', UserViewSet)
# Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.
urlpatterns = [
url(r'^', include(router.urls)),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]
解釋一下,
每個(gè) xxxSerializer 都要繼承 ModelSerializer 來選擇模型和模型字段。
UserSerializer 類繼承了更符合 RESTful 設(shè)計(jì)的 HyperlinkedModelSerializer 超鏈接模型 Serializer 類,它和普通的 ModelSerializer 類有以下區(qū)別:
- 缺省狀態(tài)下不包含 pk 字段
- 具有一個(gè) url 字段,即HyperlinkedIdentityField類型
- 用HyperlinkedRelatedField表示關(guān)系,而非PrimaryKeyRelatedField
然后在 class Meta 中選擇模型和要展現(xiàn)的模型元素
ViewSet 用來定義 View 的行為,和 Django 的 views 類似,用來處理 API 的 read 、write、 update 等方法(而 Django views 則處理 http 的 GET 和 POST )
在 ViewSet 實(shí)例化之后,通過 Router 類,最終將 URL 和 ViewSet 方法綁定起來。
ok,現(xiàn)在你可以通過在瀏覽器中訪問 http://127.0.0.1:8000/ 來查看你的 'users' API 了。
https://github.com/thehackercat/django-rest-framework-tutorial/blob