DokumentasiUnit 1: dasar-dasarnya

Bangun aplikasi catatan dengan Nexy, bagian 3: rute dinamis dan API

Bagian 3 memberikan setiap catatan URL-nya sendiri, /notes/1, dan menyajikan catatan yang sama seperti JSON di /api/notes, keduanya dibaca dari satu modul Python.

Sebelum Anda memulai: aplikasi bagian 2.

Simpan catatan dalam satu modul

Halaman dan API akan membaca daftar yang sama. Pindahkan ke modulnya sendiri, dengan fungsi yang menemukan satu catatan:

src/catatan.py
NOTES = {1: "Buy milk", 2: "Ship Nexy"}  def find(note_id: int) -> str | None:    return NOTES.get(note_id)

Tautkan setiap catatan ke halamannya

src/rute/catatan/index.nexy
---from src.notes import NOTES notes = NOTES.items()---<section class="app-page">  <h1>Notes</h1>  <ul>    {% for id, text in notes %}    <li><a href="/notes/{{ id }}">{{ text }}</a></li>    {% endfor %}  </ul></section>
src/apps/notes/notes_view.nexy
---from src.notes import NOTES notes = NOTES.items()---<section class="app-page">  <h1>Notes</h1>  <ul>    {% for id, text in notes %}    <li><a href="/notes/{{ id }}">{{ text }}</a></li>    {% endfor %}  </ul></section>

Tambahkan halaman per catatan

Nama folder atau file dalam tanda kurung adalah segmen URL: [id].nexy menjawab /notes/1, /notes/2, dan meneruskan segmen tersebut ke halaman sebagai penyangga. id: prop[int] mengubahnya menjadi angka, jadi /notes/abc menjawab 404 sebelum halaman dijalankan.

src/rute/catatan/[id].nexy
---from nexy import notFoundfrom src.notes import find id: prop[int]text = find(id)if text is None:    notFound()---<section class="app-page">  <h1>{{ text }}</h1>  <a href="/notes">All notes</a></section>

{id} di jalur pengontrol adalah segmen URL, diteruskan ke metode dengan nama tersebut. id: int mengubahnya menjadi angka, jadi /notes/abc menjawab 404 sebelum metode dijalankan.

src/apps/notes/note_view.nexy
---text: prop[str]---<section class="app-page">  <h1>{{ text }}</h1>  <a href="/notes">All notes</a></section>

notFound() menghentikan permintaan dengan 404: catatan yang tidak ada jawaban seperti URL yang tidak ada.

Sajikan catatan sebagai JSON

File .py di bawah src/routes/ adalah rute API. Setiap fungsi yang diberi nama berdasarkan metode HTTP menjawab metode tersebut:

src/routes/api/notes.py
from src.notes import NOTES  async def GET():    return [{"id": id, "text": text} for id, text in NOTES.items()]

Tiga pengontrol catatan, dalam satu file. Setiap metode yang diberi nama berdasarkan metode HTTP menjawab metode tersebut:

src/apps/notes/notes_controller.py
from nexy import notFoundfrom nexy.decorators import Controllerfrom nexy.hooks import useViewsfrom src.notes import NOTES, find LAYOUT = "src/apps/layout.nexy"  def page(view: str, **context: object):    return useViews(LAYOUT, context={"children": useViews(view, context=context)})  @Controller("/notes")class NotesController:    async def get(self):        return page("src/apps/notes/notes_view.nexy")  @Controller("/notes/{id}")class NoteController:    async def get(self, id: int):        text = find(id)        if text is None:            notFound()        return page("src/apps/notes/note_view.nexy", text=text)  @Controller("/api/notes")class NotesApiController:    async def get(self) -> list[dict]:        return [{"id": id, "text": text} for id, text in NOTES.items()]
src/apps/app_module.py
from nexy.decorators import Module from .app_controller import AboutController, AppControllerfrom .notes.notes_controller import NoteController, NotesApiController, NotesController  @Module()class AppModule:    controllers = [AppController, AboutController, NotesController, NoteController, NotesApiController]

Periksa tiga URL:

API ini terdaftar, beserta skemanya, di http://localhost:3000/docs.

Apa yang Anda pelajari

  • [id].nexy adalah segmen dinamis; id: prop[int] membaca dan mengubahnya.
  • File .py di bawah src/routes/ menjawab JSON, satu fungsi per metode HTTP.
  • {id} di jalur pengontrol adalah segmen dinamis; id: int mengubahnya.
  • Metode pengontrol yang mengembalikan data menjawab JSON; salah satu yang mengembalikan useViews menjawab halaman.
  • notFound() jawaban 404 dari mana saja; modul bersama menjaga halaman dan API tetap berjalan.

Langkah selanjutnya

Sunting di GitHub

Enter membuka hasil, Esc menutup.