用 Django 開(kāi)發(fā)一個(gè) Python Web API

Django 是 Python 編程語(yǔ)言驅(qū)動(dòng)的一個(gè)開(kāi)源模型-視圖-控制器(MVC)風(fēng)格的 Web 應(yīng)用程序框架。它是Python API開(kāi)發(fā)中最受歡迎的名稱之一,自2005年成立以來(lái),其知名度迅速提升。
Django由Django軟件基金會(huì)(Django Software Foundation)維護(hù),并獲得了社區(qū)的大力支持,在全球擁有11,600多個(gè)成員。在Stack Overflow上,Django大約有191,000個(gè)帶標(biāo)簽的問(wèn)題。Spotify,YouTube和Instagram等網(wǎng)站都依賴Django進(jìn)行應(yīng)用程序和數(shù)據(jù)管理。
本文演示了使用HTTP協(xié)議的GET方法從服務(wù)器獲取數(shù)據(jù)的簡(jiǎn)單API。
建立一個(gè)項(xiàng)目
首先,為您的Django應(yīng)用程序創(chuàng)建一個(gè)結(jié)構(gòu);您可以在系統(tǒng)上的任何位置執(zhí)行此操作:
$?mkdir?myproject
$?cd?myproject
然后創(chuàng)建一個(gè)虛擬環(huán)境,它能夠使我們根據(jù)需要安裝一些特定的包來(lái)跑通我們的程序,并且不影響當(dāng)前環(huán)境,用完退出虛擬環(huán)境即可。
$?python3?-m?venv?env
$?source?env/bin/activate
在Windows上,使用命令env \ Scripts \ activate激活Python虛擬環(huán)境。
安裝Django和Django REST框架
接下來(lái),安裝Django和Django REST框架模塊:
$?pip3?install?django
$?pip3?install?djangorestframework
實(shí)例化一個(gè)新的Django項(xiàng)目
既然您已經(jīng)為應(yīng)用程序創(chuàng)建了工作環(huán)境,那么您必須實(shí)例化一個(gè)新的Django項(xiàng)目。與像Flask這樣的小框架不同,Django在此過(guò)程中包含專用命令(請(qǐng)注意第一個(gè)命令中的結(jié)尾.字符):
$?django-admin?startproject?tutorial?.
$?cd?tutorial
$?django-admin?startapp?quickstart
Django使用數(shù)據(jù)庫(kù)作為其后端,因此您應(yīng)該在開(kāi)始開(kāi)發(fā)之前同步數(shù)據(jù)庫(kù)。可以使用運(yùn)行django-admin命令時(shí)創(chuàng)建的manage.py腳本來(lái)管理數(shù)據(jù)庫(kù)。由于您當(dāng)前位于tutorial路徑中,因此請(qǐng)使用../命令來(lái)運(yùn)行腳本,該腳本位于同一個(gè)路徑中:
$?python3?../manage.py?makemigrations
No?changes?detected
$?python4?../manage.py?migrate
Operations?to?perform:
??Apply?all?migrations:?admin,?auth,?contenttypes,?sessions
Running?migrations:
??Applying?contenttypes.0001_initial...?OK
??Applying?auth.0001_initial...?OK
??Applying?admin.0001_initial...?OK
??Applying?admin.0002_logentry_remove_auto_add...?OK
??Applying?admin.0003_logentry_add_action_flag_choices...?OK
??Applying?contenttypes.0002_remove_content_type_name...?OK
??Applying?auth.0002_alter_permission_name_max_length...?OK
??Applying?auth.0003_alter_user_email_max_length...?OK
??Applying?auth.0004_alter_user_username_opts...?OK
??Applying?auth.0005_alter_user_last_login_null...?OK
??Applying?auth.0006_require_contenttypes_0002...?OK
??Applying?auth.0007_alter_validators_add_error_messages...?OK
??Applying?auth.0008_alter_user_username_max_length...?OK
??Applying?auth.0009_alter_user_last_name_max_length...?OK
??Applying?auth.0010_alter_group_name_max_length...?OK
??Applying?auth.0011_update_proxy_permissions...?OK
??Applying?sessions.0001_initial...?OK
在Django中創(chuàng)建用戶
使用示例密碼password123創(chuàng)建一個(gè)名為admin的初始用戶:
$?python3?../manage.py?createsuperuser?\
[email protected]?\
??--username?admin
根據(jù)提示創(chuàng)建密碼。
在Django中實(shí)現(xiàn)序列化組件和視圖層
為了使Django能夠?qū)⑿畔鬟f給HTTP GET請(qǐng)求,必須將傳遞對(duì)象轉(zhuǎn)換為有效的響應(yīng)數(shù)據(jù)。Django為此實(shí)現(xiàn)了序列化組件。
在您的項(xiàng)目中,通過(guò)創(chuàng)建一個(gè)名為quickstart / serializers.py的新模塊來(lái)定義一些序列化器,該模塊將用于數(shù)據(jù)傳輸:
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']
Django中的視圖是一個(gè)接受Web請(qǐng)求并返回Web響應(yīng)的函數(shù)。響應(yīng)可以是HTML,或者是HTTP重定向,或者是HTTP錯(cuò)誤,JSON或XML文檔,圖像或TAR文件,或者可以從Internet獲得的任何其他內(nèi)容。要?jiǎng)?chuàng)建視圖函數(shù),請(qǐng)打開(kāi)quickstart / views.py并輸入以下代碼。該文件模板已經(jīng)存在,并且其中包含一些樣板文本,因此請(qǐng)保留該文本并將其添加到文件中:
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??allows?users?to?be?viewed?or?edited.
????"""
????queryset?=?User.objects.all().order_by('-date_joined')
????serializer_class?=?UserSerializer
class?GroupViewSet(viewsets.ModelViewSet):
????"""
????API?endpoint??allows?groups?to?be?viewed?or?edited.
????"""
????queryset?=?Group.objects.all()
????serializer_class?=?GroupSerializer
使用Django生成URL
現(xiàn)在,您可以生成URL,以便人們可以訪問(wèn)您的API。在文本編輯器中打開(kāi)urls.py,并將默認(rèn)示例代碼替換為以下代碼:
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)
#?Use?automatic?URL?routing
#?Can?also?include?login?URLs?for?the?browsable?API
urlpatterns?=?[
????path('',?include(router.urls)),
????path('api-auth/',?include('rest_framework.urls',?namespace='rest_framework'))
]
調(diào)整您的Django項(xiàng)目設(shè)置
此示例項(xiàng)目的設(shè)置模塊存儲(chǔ)在tutorial / settings.py中,因此請(qǐng)?jiān)谖谋揪庉嬈髦袑⑵浯蜷_(kāi),然后將rest_framework添加到INSTALLED_APPS列表的末尾:
INSTALLED_APPS?=?[
????...
????'rest_framework',
]
測(cè)試您的Django API
現(xiàn)在,您可以測(cè)試已構(gòu)建的API。首先,從命令行啟動(dòng)內(nèi)置服務(wù)器:
$?python3?manage.py?runserver
您可以使用curl獲取URL http:// localhost:8000 / users來(lái)訪問(wèn)您的API:
$?curl?--get?http://localhost:8000/users/?format=json
[{"url":"http://localhost:8000/users/1/?format=json","username":"admin","email":"[email protected]","groups":[]}]
或使用Firefox瀏覽器等:

有關(guān)使用Django和Python的RESTful API的更深入的知識(shí),請(qǐng)參閱Django文檔(https://docs.djangoproject.com/en/2.2/)。
推薦閱讀


點(diǎn)擊下方閱讀原文加入社區(qū)會(huì)員
點(diǎn)贊鼓勵(lì)一下

