دستاویزاتاعلی درجے کی
ترکیبیں
تقریباً ہر ایپ کو تین چیزوں کی ضرورت ہوتی ہے، مکمل فائلوں کے بطور آپ کاپی کر سکتے ہیں۔ filename کے ساتھ نیچے کا ہر کوڈ بلاک ایک تازہ پروجیکٹ میں لکھا جاتا ہے اور ٹیسٹ سوٹ کے ذریعہ استعمال کیا جاتا ہے، لہذا آپ جو پڑھتے ہیں وہی چلتا ہے۔
وہ سادہ API ہینڈلرز استعمال کرتے ہیں۔ ایک ہی فنکشن کسی بھی صفحے کے پیچھے موڈ میں کام کرتے ہیں۔
سیشن کے ساتھ سائن ان کریں۔
ایک وزیٹر ایک نام اور پاس ورڈ پوسٹ کرتا ہے، سرور انہیں دستخط شدہ کوکی میں یاد رکھتا ہے، اور /api/account کے تحت ہر چیز کسی اور کے لیے بند کردی جاتی ہے۔
سیشنز آن کریں۔ انہیں ضرورت ہے itsdangerous (uv add itsdangerous):
from nexy.core.models import NexyConfigModel class NexyConfig(NexyConfigModel): useSession = {"secret_key": "change-me-in-production"}سائن ان اور آؤٹ:
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}ایک 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"]}تخلیق، پڑھنے اور حذف کے ساتھ ایک JSON API
ماڈیول میں ایک اسٹور، جمع کرنے کا راستہ اور آئٹم کا راستہ۔ لغت کو ایک ڈیٹا بیس سے تبدیل کریں جب ڈیٹا کو دوبارہ شروع کرنا ضروری ہے۔
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}آپ کے کوڈ کے چلنے سے پہلے ایک باڈی جو NewNote فٹ نہیں ہوتی اسے 422 سے انکار کر دیا جاتا ہے، اور واپسی کی تشریح دستاویزی جواب بن جاتی ہے۔ دیکھیں تصدیق اور غلطیاں۔
ایک فائل وصول کریں۔
اپ لوڈز کی ضرورت ہے python-multipart (uv add python-multipart)۔ سائز خود چیک کریں، اور کلائنٹ کے فائل کا نام کبھی بھی راستے کے طور پر استعمال نہ کریں:
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۔ بائٹس کو اس نام کے تحت محفوظ کریں جو آپ تیار کرتے ہیں، اس کے تحت نہیں۔
اگلے اقدامات
- ایکشنز: فارم اور بٹن کے لیے ٹائپ شدہ سرور کے افعال
- مڈل ویئر اور سیکیورٹی: CORS، میزبان، سیشن
- ٹیسٹنگ: اسی طرح اپنے ہینڈلرز کی جانچ کریں۔