Mentakrifkan Jenis, Pertanyaan dan Mutasi
Bina skema GraphQL bertip dengan Strawberry dan pasangkannya pada aplikasi FastAPI dengan kebergantungan dikongsi.
Mentakrifkan Jenis, Pertanyaan dan Mutasi ialah pelajaran Kem Intensif Pembangunan Bahagian Belakang FastAPI percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Kem Intensif Pembangunan Bahagian Belakang FastAPI, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Kem Intensif Pembangunan Bahagian Belakang FastAPI merangkumi sejumlah 4 pelajaran.
Mengapa Strawberry untuk GraphQL pada FastAPI
Strawberry ialah pustaka GraphQL berasaskan kod untuk Python yang menggunakan dataclass dan petunjuk jenis untuk mentakrifkan skema anda. Daripada menulis SDL GraphQL secara manual, anda menulis kelas Python biasa dan Strawberry menjana skema daripadanya.
- Berasaskan kod: jenis Python ialah sumber kebenaran — SDL dijana.
- Selamat jenis: petunjuk jenis standard (
int,str,list[str],Optional) dipetakan terus kepada jenis GraphQL. - Asli ASGI: disertakan dengan penghala yang dipasang dengan kemas pada aplikasi FastAPI, sambil berkongsi gelung peristiwa dan sistem kebergantungannya.
Dalam pelajaran ini, kita membina skema berjenis (jenis, Query dan Mutation) lalu memasangnya pada FastAPI dengan kebergantungan yang dikongsi.
Mentakrifkan Jenis Objek
Jenis objek GraphQL hanyalah kelas yang dihiasi dengan @strawberry.type. Setiap atribut beranotasi menjadi medan. Petunjuk jenis menentukan jenis medan GraphQL: int menjadi Int, str menjadi String, dan medan bukan pilihan menjadi bukan nol (!).
- Gunakan
strawberry.IDuntuk medan pengecam — ia disiri sebagai rentetan tetapi menandakan semantik identiti. Optional[...](atauX | None) menjadikan medan boleh bernilai nol.
import strawberry
from typing import Optional
@strawberry.type
class Book:
id: strawberry.ID
title: str
author: str
pages: int
summary: Optional[str] = NoneJenis Akar Query
Setiap skema GraphQL memerlukan akar Query — titik masuk untuk bacaan. Anda mengisytiharkannya sebagai @strawberry.type yang medannya diselesaikan oleh kaedah yang dihiasi dengan @strawberry.field.
- Anotasi pemulangan kaedah menentukan jenis GraphQL medan tersebut.
- Parameter kaedah (selain
self) menjadi argumen GraphQL. - Memulangkan
list[Book]menghasilkan senarai bukan nol yang mengandungi buku bukan nol:[Book!]!.
import strawberry
@strawberry.type
class Query:
@strawberry.field
def books(self) -> list[Book]:
return [
Book(id="1", title="Dune", author="Herbert", pages=412),
Book(id="2", title="1984", author="Orwell", pages=328),
]
@strawberry.field
def book(self, id: strawberry.ID) -> Book | None:
for b in self.books():
if b.id == id:
return b
return NoneMembina Skema
strawberry.Schema menghubungkan jenis akar. Sekurang-kurangnya anda perlu memberikan query=Query; kemudian anda boleh menambah mutation=Mutation. Pembinaan skema mengesahkan jenis anda dan membolehkan anda mencetak SDL yang dijana — pemeriksaan kewajaran yang sangat baik.
Berikut ialah contoh yang sepenuhnya kendiri: takrifkan jenis, query, bina skema, dan laksanakan query secara segerak dengan schema.execute_sync. Tiada pelayan atau rangka kerja diperlukan.
import strawberry
@strawberry.type
class Book:
id: strawberry.ID
title: str
author: str
@strawberry.type
class Query:
@strawberry.field
def books(self) -> list[Book]:
return [Book(id="1", title="Dune", author="Herbert")]
schema = strawberry.Schema(query=Query)
result = schema.execute_sync("{ books { id title author } }")
print(result.errors)
print(result.data)Argumen Medan dan Nilai Lalai
Argumen GraphQL datang terus daripada parameter penyelesai. Parameter dengan nilai lalai menjadi argumen pilihan; tanpa nilai lalai, ia diperlukan.
- Gunakan
typing.Optional+ nilai lalai untuk menyatakan argumen pilihan yang boleh bernilai nol. - Strawberry menukarkan nilai argumen yang diterima kepada jenis Python beranotasi secara automatik.
Di bawah, limit lalai kepada 10 dan genre ialah penapis pilihan.
import strawberry
from typing import Optional
@strawberry.type
class Book:
id: strawberry.ID
title: str
genre: str
LIBRARY = [
Book(id="1", title="Dune", genre="scifi"),
Book(id="2", title="It", genre="horror"),
]
@strawberry.type
class Query:
@strawberry.field
def books(self, limit: int = 10, genre: Optional[str] = None) -> list[Book]:
items = LIBRARY if genre is None else [b for b in LIBRARY if b.genre == genre]
return items[:limit]
schema = strawberry.Schema(query=Query)
print(schema.execute_sync('{ books(genre: "scifi") { title } }').data)Jenis Input untuk Mutasi
Mutasi yang menerima data berstruktur hendaklah menggunakan jenis input: kelas yang dihiasi dengan @strawberry.input. Jenis input ialah setara GraphQL bagi isi permintaan — ia memastikan tandatangan mutasi kemas dan menerangkan dirinya sendiri.
- Medan tanpa nilai lalai ialah medan input yang diperlukan.
- Gunakan semula input yang sama merentasi aliran penciptaan/pengemaskinian dengan menjadikan medan pilihan apabila sesuai.
import strawberry
from typing import Optional
@strawberry.input
class AddBookInput:
title: str
author: str
pages: Optional[int] = NoneJenis Akar Mutation
Akar Mutation mencerminkan Query tetapi menyatakan operasi tulis. Setiap kaedah ialah @strawberry.mutation. Konvensyen: terima jenis input, lakukan kesan sampingan, dan pulangkan objek yang dicipta atau dikemas kini supaya klien boleh membaca medan terkini dalam satu perjalanan pergi balik.
Contoh ini mengekalkan stor dalam memori dan memulangkan Book baharu. Contoh ini sepenuhnya kendiri dan boleh dijalankan.
import strawberry
_DB: list["Book"] = []
@strawberry.type
class Book:
id: strawberry.ID
title: str
author: str
@strawberry.input
class AddBookInput:
title: str
author: str
@strawberry.type
class Query:
@strawberry.field
def books(self) -> list[Book]:
return _DB
@strawberry.type
class Mutation:
@strawberry.mutation
def add_book(self, data: AddBookInput) -> Book:
book = Book(id=str(len(_DB) + 1), title=data.title, author=data.author)
_DB.append(book)
return book
schema = strawberry.Schema(query=Query, mutation=Mutation)
q = 'mutation { addBook(data: {title: "Dune", author: "Herbert"}) { id title } }'
print(schema.execute_sync(q).data)Penyelesai Tak Segerak
Oleh sebab Strawberry berjalan pada ASGI, penyelesai boleh menjadi async. Ini penting pada FastAPI: penyelesai anda akan menggunakan await untuk panggilan pangkalan data, klien HTTP atau carian cache tanpa menyekat gelung peristiwa.
- Hanya isytiharkan
async def— Strawberry akan menunggunya untuk anda. - Campurkan penyelesai segerak dan tak segerak secara bebas dalam skema yang sama.
- Gunakan penyelesai tak segerak untuk sebarang I/O supaya satu permintaan GraphQL dengan banyak medan kekal tidak menyekat.
import strawberry
import asyncio
@strawberry.type
class Stats:
total_books: int
async def fetch_count() -> int:
await asyncio.sleep(0) # stand-in for an async DB call
return 42
@strawberry.type
class Query:
@strawberry.field
async def stats(self) -> Stats:
return Stats(total_books=await fetch_count())
schema = strawberry.Schema(query=Query)
print(asyncio.run(schema.execute("{ stats { totalBooks } }")).data)Memasang pada FastAPI dengan GraphQLRouter
Strawberry menyediakan strawberry.fastapi.GraphQLRouter, iaitu APIRouter yang anda pasang dengan app.include_router. Ia menyediakan titik akhir GraphQL dan IDE dalam pelayar (GraphiQL) pada laluan yang sama.
- Berikan
schemayang telah dibina kepada penghala. - Pasangkannya di bawah laluan seperti
/graphql. - Penghala menggunakan gelung peristiwa FastAPI, jadi penyelesai tak segerak dan peristiwa permulaan/penutupan FastAPI berfungsi bersama.
Ini ialah kod rangka kerja, jadi ia tidak boleh dijalankan pada penghakim kosong.
import strawberry
from fastapi import FastAPI
from strawberry.fastapi import GraphQLRouter
@strawberry.type
class Query:
@strawberry.field
def hello(self) -> str:
return "world"
schema = strawberry.Schema(query=Query)
graphql_app = GraphQLRouter(schema)
app = FastAPI()
app.include_router(graphql_app, prefix="/graphql")Berkongsi Kebergantungan melalui Konteks
Manfaat utama memasang pada FastAPI ialah kebergantungan yang dikongsi. Berikan context_getter kepada GraphQLRouter — ia ialah boleh panggil kebergantungan FastAPI, jadi ia sendiri boleh menggunakan Depends pada sesi DB, pengguna semasa atau objek tetapan.
Apa sahaja yang dipulangkan oleh pengambil konteks didedahkan kepada penyelesai melalui strawberry.Info pada info.context. Inilah cara pengesahan dan sesi pangkalan data mengalir daripada FastAPI ke penyelesai GraphQL anda.
from fastapi import Depends
from strawberry.fastapi import GraphQLRouter
async def get_db():
# yield a real async session in production
yield {"connection": "db-session"}
async def get_context(db=Depends(get_db)):
return {"db": db, "role": "reader"}
graphql_app = GraphQLRouter(schema, context_getter=get_context)Membaca Konteks dalam Penyelesai
Untuk menggunakan konteks yang dikongsi, tambahkan parameter info: strawberry.Info pada penyelesai. Strawberry menyuntikkannya secara automatik dan ia tidak pernah muncul sebagai argumen GraphQL. Akses kebergantungan anda melalui info.context.
info.context["db"]— sesi yang disediakan olehcontext_getter.- Gunakannya untuk memberi kuasa: baca pengguna semasa dan jana ralat jika kebenaran tiada.
- Objek konteks yang sama dikongsi merentasi setiap penyelesai dalam satu permintaan.
import strawberry
@strawberry.type
class Query:
@strawberry.field
def current_role(self, info: strawberry.Info) -> str:
return info.context["role"]
@strawberry.field
def secret(self, info: strawberry.Info) -> str:
if info.context["role"] != "admin":
raise Exception("forbidden")
return "top-secret"Semakan Pantas: Berkongsi Sesi DB
Anda telah memasang skema Strawberry pada FastAPI dan memerlukan setiap penyelesai GraphQL menggunakan sesi pangkalan data yang sama bagi setiap permintaan seperti yang diperoleh oleh titik akhir REST anda daripada kebergantungan FastAPI. Apakah cara idiomatik Strawberry + FastAPI untuk menyambungkannya?
Imbas Kembali
Anda telah membina skema GraphQL berjenis dengan Strawberry dan memasangnya pada FastAPI:
- Jenis: kelas
@strawberry.typedengan medan berpetunjuk jenis;strawberry.IDuntuk pengecam danOptionaluntuk medan yang boleh bernilai nol. - Query: akar bacaan, dengan penyelesai
@strawberry.fieldyang parameternya menjadi argumen GraphQL. - Mutasi: kaedah
@strawberry.mutationyang menerima jenis@strawberry.inputdan memulangkan objek yang terjejas. - Skema:
strawberry.Schema(query=Query, mutation=Mutation), yang boleh disahkan denganexecute_sync. - Integrasi FastAPI: pasang dengan
GraphQLRouter, dan kongsi sesi DB serta pengesahan melaluicontext_getter+info.context, dengan menggunakan semula suntikan kebergantungan FastAPI.
Pendekatan berasaskan kod dan selamat jenis ini memastikan API GraphQL serta aplikasi FastAPI anda menggunakan bahasa yang sama — petunjuk jenis Python.
Pelajari Kem Intensif Pembangunan Bahagian Belakang FastAPI dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 21
- Pelajaran
- 84
Soalan Lazim
Adakah pelajaran “Mentakrifkan Jenis, Pertanyaan dan Mutasi” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Kem Intensif Pembangunan Bahagian Belakang FastAPI, termasuk “Mentakrifkan Jenis, Pertanyaan dan Mutasi”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Kem Intensif Pembangunan Bahagian Belakang FastAPI merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Mentakrifkan Jenis, Pertanyaan dan Mutasi”?
Bina skema GraphQL bertip dengan Strawberry dan pasangkannya pada aplikasi FastAPI dengan kebergantungan dikongsi. Anda berlatih Kem Intensif Pembangunan Bahagian Belakang FastAPI menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Kem Intensif Pembangunan Bahagian Belakang FastAPI?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Kem Intensif Pembangunan Bahagian Belakang FastAPI di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.
Berapa lamakah pelajaran “Mentakrifkan Jenis, Pertanyaan dan Mutasi” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Kem Intensif Pembangunan Bahagian Belakang FastAPI ini?
Ya. Setiap pelajaran Kem Intensif Pembangunan Bahagian Belakang FastAPI menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Mentakrifkan Jenis, Pertanyaan dan Mutasi
- Menyelesaikan Pertanyaan N+1 dengan DataLoaders
- Langganan GraphQL Masa Nyata
- Analisis Kos Pertanyaan dan Had Kedalaman