python django中restful框架的使用

頂級飲水機管理員發表於2021-06-21

在使用django進行前後臺分離開發時通常會搭配django-rest-framework框架建立RESTful風格的介面API。框架介紹及版本要求可參考官方地址:https://www.django-rest-framework.org

Creating-Python-APIs-Like-a-BOSS-The-Django-REST-Framework-Course

本文以建立man包含namesex欄位的API為例項學習django-rest-framework框架的使用。

主要包含下面5個步驟:

  1. 建立Django專案
  2. 建立ORM模型
  3. 載入Django REST Framework
  4. 序列化模型
  5. 建立載入資料的view和url

1.建立Django專案

建立django_rest

django-admin startproject django_rest

進入django_rest,建立虛擬環境env

virtualenv env

啟用虛擬環境,並安裝django

source ./env/bin/activate

安裝 django

pip install django

建立rest_app

python manage.py startapp rest_app

註冊app,將app新增到INSTALLED_APPS

#setting.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_app'
]

建立後臺admin賬戶用於管理

$ python manage.py createsuperuser

Username (leave blank to use 'root'):admin 
Email address: 
Password: 
Password (again): 
Superuser created successfully.

2.建立ORM模型

資料庫我們使用預設sqlite3 即可,如需要變更可在setting.py中databases配置。

修改我們/django_rest/models.py新增我們man的模型

#models.py

from django.db import models



# Create your models here.
class Man(models.Model):
    name = models.CharField(max_length=64)
    sex = models.CharField(max_length=64)

    def __str__(self):
        return self.name

做資料庫遷移

python manage.py makemigrations 
python manage.py migrate

image-20210621160708390

將Man這個model註冊到我們的後臺,以便可以通過django的後臺做增刪查改,編寫admin.py如下

#admin.py
from django.contrib import admin
from .models import Man
# Register your models here.

admin.site.register(Man)  # 註冊Man到後臺

啟動django服務

python manage.py runserver

訪問 http://127.0.0.1:8000/admin/可以看到登入介面,輸入密碼登入

image-20210621162254044

可以看到我們的rest_app下的模型man物件mans

image-20210621163034920

我們新增一個那個男人lgd.ame

image-20210621163158979


3. 載入Django REST Framework

安裝工具包

pip install djangorestframework

註冊rest_framework

#setting.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_app'
    'rest_framework' #註冊
]
4.序列化模型

序列化器會把我們的模型資料轉化(序列化)為json格式,這樣就能夠被請求了。同樣當有josn資料提交過來的時候,序列化器會將json資料轉換為模型供咋們使用。

我們在rest_app下建立檔案serializer.py

我們要做三件事:

  1. 匯入Man模型
  2. 匯入序REST Framework序列化器
  3. 建立新的類將模型和序列化器連結起來
from rest_framework import serializers

from .models import Man

class Manserializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Man
        fields = ('name','sex')

5.建立載入資料的view和url

我們需要把序列化後的資料返回給瀏覽器,所以要做一下步驟:

  1. 通過不通的Man查詢資料庫
  2. 將查詢後的資料傳遞給序列化器,通過序列化器轉化為json

我們在rest_app/views.py編寫我們的檢視,ModelViewSet由rest_framework提供,包含了get、post方法

# views.py
from rest_framework import viewsets

from .serializers import ManSerializer
from .models import Man


class ManViewSet(viewsets.ModelViewSet):
    queryset = Man.objects.all().order_by('name')  #查詢結果給queryset
    serializer_class = ManSerializer     #對結果進序列化

在django_rest目錄下urls.py新增api路由

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('rest_app.urls')),
 ]

在rest_app目錄下建立urls.py新增檢視路由,通過rest_framework中router確保我們的請求到正確的動態資源。

from django.urls import include, path
from rest_framework import routers
from . import views

router = routers.DefaultRouter()
router.register(r'man', views.ManViewSet)   #路由到ManViewSet檢視

# Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.
urlpatterns = [
    path('', include(router.urls)), #使用router路由
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

最後我們來啟動服務,訪問http://127.0.0.1:8000/ 可以在瀏覽器檢視到我們api資訊

python manage.py runserver

image-20210621182048294

訪問http://127.0.0.1:8000/man/ 來檢視man資源

image-20210621181859700

通過id來訪問api資源http://127.0.0.1:8000/man/1/

image-20210621182006651


這樣我們一個基礎restful風格的API建立完成了。感覺關鍵點還是理解ModelViewSet和內建router不讀原始碼很難知其所以然。


文章有不足的地方歡迎在評論區指出。

歡迎收藏、點贊、提問。關注頂級飲水機管理員,除了管燒熱水,有時還做點別的。

相關文章