iT邦幫忙

0

[DAY6] Django與Docker Compose後端開發實戰 - 設置Admin管理系統與整合Swagger

  • 分享至 

  • xImage
  •  

在上一篇文章中,我們學習了如何修改Django項目的資料庫結構,並探討了MariaDB的使用方法。本篇文章中,我們將探討如何設置Django Admin管理系統,以及如何整合Swagger以便更方便地進行API文檔和測試:

[DAY5] Django與Docker Compose後端開發實戰 - 資料庫結構修改與MariaDB管理最佳實踐

建立Admin管理系統

Django Admin的設置通常在項目的全局settings.py文件中進行配置,例如註冊Admin應用、定義全局的Admin樣式和配置。每個App可以有自己的admin.py文件,用於註冊該App中的模型到Django Admin後台,這允許我們為每個模型定義定制的展示、過濾和編輯行為。

配置全局設置

我們先以account這個認證用的使用者App來說明,首先需要確認settings.py中的配置:

  • backend/settings.py
AUTH_USER_MODEL = 'account.UserProfile'

INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    ...
]

註冊模型到Admin

account應用中,我們需要在admin.py文件中註冊模型:

  • account/admin.py
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import UserProfile

@admin.register(UserProfile)
class UserProfileAdmin(UserAdmin):
    model = UserProfile
    fieldsets = UserAdmin.fieldsets
    add_fieldsets = UserAdmin.add_fieldsets

訪問Admin管理後台

設置完成後,我們可以嘗試連接到管理員平台:

http://localhost:8000/admin

進入後我們可以看到兩個資料欄位User和Group。接下來我們嘗試建立一個名叫king的群組,方便我們後續進行權限管理的示範:

https://ithelp.ithome.com.tw/upload/images/20240610/20162710qCMPv6fya7.png

建立後,接著我們來到user頁面,並將我們的使用者帳號也歸屬於該群組內:

https://ithelp.ithome.com.tw/upload/images/20240610/20162710dM8nRzqkKO.png

使用群組來區分使用者的權限

我們將設定只有在king群組的使用者才有權限使用hello的API:

  • hello/views.py
from rest_framework import permissions, viewsets
from .models import HelloModel
from .serializers import HelloSerializer
import logging

logger = logging.getLogger('django')

class IsMemberOfKing(permissions.BasePermission):
    def has_permission(self, request, view):
        if request.user and request.user.groups.filter(name='king').exists():
            return True
        return False

class HelloViewSet(viewsets.ModelViewSet):
    queryset = HelloModel.objects.all()
    serializer_class = HelloSerializer
    permission_classes = [permissions.IsAuthenticated, IsMemberOfKing]

首先獲取Token:

curl --location 'http://localhost:8000/account/token/' \     
--header 'Content-Type: application/json' \
--data '{
  "username": "lucien",
  "password": "lucien"
}'

接著嘗試呼叫API:

curl --location 'http://localhost:8000/api/hello' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <your_access_token>' \
--data '{
    "name": "Lucien Test2"
}'

建立Swagger系統

安裝並配置Swagger

首先在requirements.txt中添加drf-spectacular

  • requirements.txt
drf-spectacular

記得重建Docker容器以下載新的依賴:

docker-compose -f docker-compose-local.yml down
docker-compose -f docker-compose-local.yml up --build -d

接下來,更新全局設置:

  • backend/settings.py
INSTALLED_APPS = [
    ...
    'drf_spectacular',
]

REST_FRAMEWORK = {
    ...
    'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema',
}

SPECTACULAR_SETTINGS = {
    'TITLE': 'Template API',
    'DESCRIPTION': 'Detailed description of API',
    'VERSION': '1.0.0',
    'SERVE_INCLUDE_SCHEMA': False,
}

配置URL

urls.py中添加Swagger相關的路由配置:

  • backend/urls.py
from django.contrib import admin
from django.urls import path, include
from drf_spectacular.views import SpectacularAPIView, SpectacularRedocView, SpectacularSwaggerView

urlpatterns = [
    path('api/schema/', SpectacularAPIView.as_view(), name='schema'),
    path('api/schema/swagger-ui/', SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'),
    path('api/schema/redoc/', SpectacularRedocView.as_view(url_name='schema'), name='redoc'),
    ...
]

使用Swagger UI

配置完成後,我們可以通過以下URL訪問Swagger UI:

http://localhost:8000/api/schema/swagger-ui/

進入Swagger UI後,可以嘗試直接在界面上獲取Token:

https://ithelp.ithome.com.tw/upload/images/20240610/20162710TQYluwjwJE.png

將獲取的Token填入右上角的驗證按鈕進行登入操作:

https://ithelp.ithome.com.tw/upload/images/20240610/20162710PDtMEwQIip.png

完成後,我們就能對其他的API在Swagger上進行測試了。此外,你也可以嘗試連接其他文檔網站:

http://localhost:8000/api/schema/redoc/

結論

在這篇文章中,我們學習了如何設置Django Admin管理系統,並通過群組來管理用戶權限。我們還整合了Swagger,使API文檔和測試變得更加方便。通過這些配置,我們的Django項目變得更加完善和易於管理。在下一篇文章中,將手把手教各位如何設定Logger、Middleware和Core等設置。

[DAY7] Django與Docker Compose後端開發實戰 - 建立Logger系統、Middleware和CORS


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言