咱們將建立一個簡單的API來容許管理員用戶查看和編輯系統中的用戶和組。python
建立一個新的django項目,命名爲:<tutorial>,而後建立一個新的應用程序(app),命名爲:<quickstart>。web
# Create the project directory數據庫
mkdir tutorialdjango
cd tutorialjson
# Create a virtual environment to isolate our package dependencies locallyapi
python3 -m venv env瀏覽器
source env/bin/activate # On Windows use `env\Scripts\activate`bash
# Install Django and Django REST framework into the virtual environmentapp
pip install djangocurl
pip install djangorestframework
# Set up a new project with a single application
django-admin startproject tutorial . # Note the trailing '.' character
cd tutorial
django-admin startapp quickstart
cd ..
項目的佈局應該是這樣的:
$ pwd
<some path>/tutorial
$ find .
.
./manage.py
./tutorial
./tutorial/__init__.py
./tutorial/quickstart
./tutorial/quickstart/__init__.py
./tutorial/quickstart/admin.py
./tutorial/quickstart/apps.py
./tutorial/quickstart/migrations
./tutorial/quickstart/migrations/__init__.py
./tutorial/quickstart/models.py
./tutorial/quickstart/tests.py
./tutorial/quickstart/views.py
./tutorial/settings.py
./tutorial/urls.py
./tutorial/wsgi.py
這個項目目錄看起來有不太同樣,它的應用程序創建在項目目錄內。使用項目的命名空間能夠避免和外部模塊發生命名衝突(這個話題超出了本文章的討論範圍)。
如今,能夠開始同步咱們的數據庫了。
python manage.py migrate
一樣。咱們還須要建立一個初始用戶,並將其命名爲:<admin>。將密碼設置爲:<password123>。
python manage.py createsuperuser --email admin@example.com --username admin
當你設置好數據庫,初始用戶建立完成後,打開應用程序<quickstart>目錄,而後就能夠開始寫代碼啦~
第一步咱們將定義一些序列化工具(serializers)。讓咱們建立一個新的模塊。命名爲:<tutorial/quickstart/serializers.py
>。咱們將使用這個模塊來描述咱們的數據。
from django.contrib.auth.models import User, Group
from rest_framework import serializers
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ['url', 'username', 'email', 'groups']
class GroupSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Group
fields = ['url', 'name']
注意咱們如今使用的序列化工具<UserSerializer
>和<GroupSerializer
>都繼承至<HyperlinkedModelSerializer
>這個父類。這個父類容許咱們以超連接的方式來描述數據表之間的關係。你也可使用主鍵<primary key>或者其餘方式來關聯數據表之間的關係,可是使用超連接這種設計方式是很是符合RESTful1設計的。
第二步。咱們須要搞定視圖部分了。打開<tutorial/quickstart/views.py
>,而後開始寫代碼吧~
from django.contrib.auth.models import User, Group
from rest_framework import viewsets
from tutorial.quickstart.serializers import UserSerializer, GroupSerializer
class UserViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows users to be viewed or edited.
"""
queryset = User.objects.all().order_by('-date_joined')
serializer_class = UserSerializer
class GroupViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows groups to be viewed or edited.
"""
queryset = Group.objects.all()
serializer_class = GroupSerializer
咱們經過類<ViewSets>這個類,將視圖函數中功能一致的部分都整合到一塊兒。這樣就不須要寫不少的視圖函數了。
固然, 在一些須要自定義的狀況下咱們也能夠輕易地將整合好的視圖分離,可是使用<ViewSets>可讓咱們的邏輯整理的更加清晰同時代碼也更加簡潔。
接下來咱們該設置咱們的API路由了。打開<tutorial/urls.py
>。
from django.urls import include, path
from rest_framework import routers
from tutorial.quickstart import views
router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'groups', views.GroupViewSet)
# Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.
urlpatterns = [
path('', include(router.urls)),
path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]
由於咱們使用<ViewSets>實例替代了原始的視圖,這讓咱們能夠經過在<DefaultRouter
>的實例中,中註冊咱們的<ViewSets>實例便可自動地爲咱們生成相應的路由。
固然,若是咱們但願自定義路由使其功能更加豐富,也能夠拋棄這個功能轉而使用普通的基於類的視圖,而後定義路由。
最後一步,將用戶登陸和登出視圖放置在了可瀏覽的API頁面內。這是一個可選擇項,若是你的須要使用可瀏覽的API頁面和用戶管理。
分頁功能讓你能夠控制每頁顯示多少個對象。要使用它的話請在文件<tutorial/settings.py
>內添加如下代碼:
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 10
}
打開設置模塊<tutorial/settings.py
>,將<’rest_framework’>添加到<INSTALLED_APPS
>。以下:
INSTALLED_APPS = [
...
'rest_framework',
]
以上,咱們已經作完了。一個簡單的用戶管理API,而且能夠在瀏覽器上快速訪問,測試的API。看完以上東西你可能會想:」wtf???!!!。這是什麼東西?」。接下來咱們將作一些測試,來幫助你理解。咱們到底作了個什麼的東西。
如今咱們能夠開始測試剛剛搭建好的API。不過在這以前咱們先定一個小目標,好比先讓程序跑起來。
python manage.py runserver
若是小目標沒有實現。請查看錯誤信息,而後翻回去仔細看看代碼。
接下來咱們就能夠訪問咱們的API了。能夠經過命令行訪問,使用curl工具:
bash: curl -H 'Accept: application/json; indent=4' -u admin:password123 http://127.0.0.1:8000/users/
{
"count": 2,
"next": null,
"previous": null,
"results": [
{
"email": "admin@example.com",
"groups": [],
"url": "http://127.0.0.1:8000/users/1/",
"username": "admin"
},
{
"email": "tom@example.com",
"groups": [ ],
"url": "http://127.0.0.1:8000/users/2/",
"username": "tom"
}
]
}
或者使用Httpie工具:
bash: http -a admin:password123 http://127.0.0.1:8000/users/
HTTP/1.1 200 OK
...
{
"count": 2,
"next": null,
"previous": null,
"results": [
{
"email": "admin@example.com",
"groups": [],
"url": "http://localhost:8000/users/1/",
"username": "paul"
},
{
"email": "tom@example.com",
"groups": [ ],
"url": "http://127.0.0.1:8000/users/2/",
"username": "tom"
}
]
}
或者直接使用瀏覽器。打開連接:http://127.0.0.1:8000/users/
若是你是經過瀏覽器訪問的,你須要在右上角登陸。由於這個管理工具是給admin用的。遊客沒法訪問。
若是還要深刻學習和理解REST framework是如何將這些功能一步一步封裝到一塊兒的。請繼續收看以後的指導文章,或者直接閱讀咱們的API。
以上就是本文所有內容,若是你看不懂,那大概須要用django再作幾個小項目來熟悉一下django web應用的業務流程。