iT邦幫忙

2023 iThome 鐵人賽

DAY 4
0

首先先將之前”安裝 Strawberry 環境”所建立的開發環境開啟。

$ cd strawberry-tutorial

這個時候專案目錄的結構應該會是像下面這樣:

.
├── .python-version
├── poetry.lock
├── pyproject.toml
└── schema.py

接下來將練習的開發環境重新編排檔案與目錄結構,結果如下:

  .
  ├── .python-version
+ ├── app
+ │   ├── __init__.py
+ │   ├── mutation.py
+ │   ├── query.py
+ │   ├── services.py
+ │   └── types.py
+ ├── main.py
  ├── poetry.lock
  ├── pyproject.toml
- └── schema.py
  • main.py:會是我們 strawberry debug server 的啟動程式。
  • app:應用程式相關 Python 模組放在這裡。
  • __init__.py:會 import 相關 GraphQL 模組進來,並且建立 schema,同時也是讓 app 目錄變成 Python 模組。
  • query.py:GraphQL 相關查詢的操作實作程式碼。
  • mutation.py:GraphQL 相關變更的操作實作程式碼。
  • types.py:GraphQL 的物件型態(Object Type)的實作程式碼。
  • services.py:應用程式相關的邏輯程式碼。

建立完成開發環境檔案與目錄之後,首先建立一個 User 的物件型態,會有使用者編號使用者名稱電子信箱姓氏名子密碼最後登入時間是否啟用等欄位,在 types.py 中編輯:

import datetime
import typing
import strawberry

@strawberry.type
class User:
    id: strawberry.ID
    username: str
    email: str
    first_name: str
    last_name: str
    password: str
    last_login: typing.Optional[datetime.datetime]
    is_active: bool = True

在 Strawberry 中建立物件型態(Object Type)是使用類似 Python 3 的 Data Classes 的方式建立類別(class),並且類別中的屬性(attributes)使用變數標註 [1] 的方式宣告,作為欄位(Field),其中 strawberry.ID 是代表唯一值的特殊字串,另外 Strawberry 預設每個欄位型態是 Non-Null 的,如果要可以是 Null 的就是使用 typing.Optional 標註型態。

為了能夠簡單測試一下上面建立的 User Type,我們接著編輯query.py

import typing
import datetime

import strawberry

from app import types

def get_users() -> typing.List[types.User]:
    return [
        types.User(
            id=1,
            username="bob",
            email="bob@mymail.com",
            first_name="Bob",
            last_name="User",
            password="xxxxxx",
            last_login=datetime.datetime.now(),
        ),
    ]

@strawberry.type
class Query:
    users: typing.List[types.User] = strawberry.field(resolver=get_users)

在這邊宣告一個 get_users() 的函式,用來產生一個使用者列表,並在函式內宣告一個 ListList 內包含一個 User 物件。

在前面 GraphQL 型別系統中有說明到要建立一個名為 Query 的物件型態來作為查詢操作的進入點,而在 Query 中宣告一個 users 的欄位,它的型態會是get_all_users()的回傳值的型態,並且使用 strawberry.field 來宣告 users 是一個 GraphQL 欄位,然後使用 resolver 參數來傳入一個函式,傳入的函式的回傳值是該欄位的查詢結果。

再來在__init__.py 建立 schema,並將 Query 傳入,編輯的內容如下:

import strawberry

from app import query

__all__ = ["schema"]

schema = strawberry.Schema(query=query.Query)

接下來我們啟動要 strawberry debug server,所以在 main.py 中加入下面內容:

from app import schema

最後啟動 strawberry debug server,我們在 terminal 執行以下指令:

$ strawberry server main:schema
Running strawberry on http://0.0.0.0:8000/graphql 🍓

在瀏覽器開啟 http://0.0.0.0:8000/graphql 可以看到 GraphiQL 的頁面,GraphiQL 頁面能夠看到整個 GraphQL API 的 schema 文件,如下圖:

https://ithelp.ithome.com.tw/upload/images/20230918/20161957fqBnXk1FZb.png

並且 strawberry 有提供 GraphiQL Explorer 提供我們方便地在 GraphiQL 頁面上建立 GraphQL 查詢語法,如下圖:

https://ithelp.ithome.com.tw/upload/images/20230918/201619573r3HLsd0NZ.png

可以在 Explorer 的區域建立多個查詢,每個查詢也可以建立查詢名稱,像是 UserList,在 Explorer 上可以勾選需要查詢欄位,Explorer 設定的結果會顯示在中間的編輯區,按下編輯區的右上角執行按鈕,即可在右邊區域顯示結果的 JSON 格式資料。

參考資料


上一篇
Day 3:GraphQL 型別系統
下一篇
Day 5:使用 Strawberry 學習 GraphQL 型別 – 2
系列文
Django 與 Strawberry GraphQL:探索現代 API 開發之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言