DokumentasiLanjutan
Resep
Tiga hal yang dibutuhkan hampir setiap aplikasi, yaitu file lengkap yang dapat Anda salin. Setiap blok kode di bawah ini dengan filename ditulis ke dalam proyek baru dan dijalankan oleh rangkaian pengujian, jadi apa yang Anda baca itulah yang dijalankan.
Mereka menggunakan penangan API biasa; fungsi yang sama berfungsi di belakang halaman dalam mode.
Masuk dengan sesi
Pengunjung memposting nama dan kata sandi, server mengingatnya dalam cookie yang ditandatangani, dan semua yang ada di bawah /api/account tertutup untuk orang lain.
Aktifkan sesi. Mereka membutuhkan itsdangerous (uv add itsdangerous):
from nexy.core.models import NexyConfigModel class NexyConfig(NexyConfigModel): useSession = {"secret_key": "change-me-in-production"}Masuk dan keluar:
from pydantic import BaseModel from nexy.http import HTTPException, Request USERS = {"ada": "lovelace"} class Credentials(BaseModel): name: str password: str async def POST(request: Request, body: Credentials): if USERS.get(body.name) != body.password: raise HTTPException(status_code=401, detail="Wrong name or password") request.session["user"] = body.name return {"user": body.name}from nexy.http import Request async def POST(request: Request): request.session.clear() return {"signed_out": True}Jaga seluruh folder dengan satu dependencies.py:
from nexy.http import HTTPException, Request def current_user(request: Request) -> str: if not request.session.get("user"): raise HTTPException(status_code=401, detail="Sign in first") return request.session["user"] dependencies = [current_user]from nexy.http import Request async def GET(request: Request): return {"user": request.session["user"]}API JSON dengan buat, baca, dan hapus
Penyimpanan dalam modul, rute pengumpulan, dan rute item. Ganti kamus dengan basis data ketika data harus bertahan jika dimulai ulang.
from pydantic import BaseModel class Note(BaseModel): id: int title: str NOTES: dict[int, Note] = {}from pydantic import BaseModel from src.notes import NOTES, Note class NewNote(BaseModel): title: str async def GET() -> list[Note]: return list(NOTES.values()) async def POST(body: NewNote) -> Note: note = Note(id=max(NOTES, default=0) + 1, title=body.title) NOTES[note.id] = note return notefrom nexy.http import HTTPException from src.notes import NOTES, Note async def GET(id: int) -> Note: if id not in NOTES: raise HTTPException(status_code=404, detail="No such note") return NOTES[id] async def DELETE(id: int) -> dict[str, bool]: if NOTES.pop(id, None) is None: raise HTTPException(status_code=404, detail="No such note") return {"deleted": True}Isi yang tidak cocok dengan NewNote ditolak dengan 422 sebelum kode Anda dijalankan, dan anotasi pengembalian menjadi respons yang terdokumentasi. Lihat validasi dan kesalahan.
Terima berkas
Upload perlu python-multipart (uv add python-multipart). Periksa sendiri ukurannya, dan jangan pernah menggunakan nama file klien sebagai jalur:
from pathlib import Path from nexy.http import HTTPException, UploadFile MAX_BYTES = 1_000_000 async def POST(file: UploadFile) -> dict[str, int | str]: data = await file.read() if len(data) > MAX_BYTES: raise HTTPException(status_code=413, detail="File too large") name = Path(file.filename or "upload").name return {"name": name, "size": len(data)}Path(...).name menghapus folder apa pun yang diberi nama oleh klien, misalnya ../../etc/passwd. Simpan byte dengan nama yang Anda hasilkan, bukan dengan nama ini.
Langkah selanjutnya
- Aksi: fungsi server yang diketik untuk formulir dan tombol
- Middleware dan keamanan: CORS, host, sesi
- Pengujian: uji penangan Anda sendiri dengan cara yang sama