दस्तावेज़उन्नत

व्यंजन विधि

लगभग हर ऐप को तीन चीज़ों की ज़रूरत होती है, संपूर्ण फ़ाइलों के रूप में जिन्हें आप कॉपी कर सकते हैं। filename के साथ नीचे दिया गया प्रत्येक कोड ब्लॉक एक नए प्रोजेक्ट में लिखा गया है और परीक्षण सूट द्वारा प्रयोग किया जाता है, इसलिए आप जो पढ़ते हैं वही चलता है।

वे सादे एपीआई हैंडलर का उपयोग करते हैं; समान फ़ंक्शन किसी पृष्ठ के पीछे मोड में काम करते हैं।

एक सत्र के साथ साइन इन करें

एक विज़िटर एक नाम और एक पासवर्ड पोस्ट करता है, सर्वर उन्हें एक हस्ताक्षरित कुकी में याद रखता है, और /api/account के तहत सब कुछ किसी और के लिए बंद है।

सत्र चालू करें. उन्हें itsdangerous (uv add itsdangerous) की आवश्यकता है:

nexyconfig.py
from nexy.core.models import NexyConfigModel  class NexyConfig(NexyConfigModel):    useSession = {"secret_key": "change-me-in-production"}

साइन इन करें और बाहर जाएं:

src/routes/api/login.py
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}
src/routes/api/logout.py
from nexy.http import Request  async def POST(request: Request):    request.session.clear()    return {"signed_out": True}

एक dependencies.py से पूरे फ़ोल्डर की सुरक्षा करें:

src/routes/api/account/dependents.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]
src/routes/api/account/index.py
from nexy.http import Request  async def GET(request: Request):    return {"user": request.session["user"]}

बनाने, पढ़ने और हटाने के साथ एक JSON एपीआई

एक मॉड्यूल में एक स्टोर, एक संग्रह मार्ग और एक आइटम मार्ग। जब डेटा पुनः आरंभ होना चाहिए तो शब्दकोश को डेटाबेस से बदलें।

src/notes.py
from pydantic import BaseModel  class Note(BaseModel):    id: int    title: str  NOTES: dict[int, Note] = {}
src/routes/api/notes/index.py
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 note
src/routes/api/notes/[id].py
from 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}

आपके कोड के चलने से पहले एक बॉडी जो NewNote में फिट नहीं होती, उसे 422 के साथ अस्वीकार कर दिया जाता है, और रिटर्न एनोटेशन दस्तावेजी प्रतिक्रिया बन जाता है। सत्यापन और त्रुटियाँ देखें।

एक फ़ाइल प्राप्त करें

अपलोड के लिए python-multipart (uv add python-multipart) की आवश्यकता है। आकार स्वयं जांचें, और कभी भी क्लाइंट के फ़ाइल नाम को पथ के रूप में उपयोग न करें:

src/routes/api/upload.py
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 क्लाइंट द्वारा नाम में रखे गए किसी भी फ़ोल्डर को हटा देता है, जैसे कि ../../etc/passwd। बाइट्स को आपके द्वारा जेनरेट किए गए नाम के अंतर्गत सहेजें, इस नाम के अंतर्गत नहीं।

अगले चरण

GitHub पर संपादित करें

Enter परिणाम खोलता है, Esc बंद करता है।