ডকুমেন্টেশনPython API এবং ত্রুটি

ব্যতিক্রম এবং ত্রুটি

একটি অনুরোধ চারটি জায়গায় ব্যর্থ হতে পারে এবং Nexy প্রতিটির ভিন্নভাবে উত্তর দেয়৷ এই পৃষ্ঠাটি হল সূচী: আপনি যে স্ট্যাটাসটি দেখছেন তা খুঁজুন, তারপর যে লাইনটি এটি তৈরি করেছে, তারপর ফাইলটি যা বডি নির্ধারণ করে।

সংক্ষিপ্ত সংস্করণ

কি হয়েছে স্ট্যাটাস ব্রাউজার দেখে API ক্লায়েন্ট দেখে
URL এর সাথে কোনো রুট মেলে না 404 notfound.nexy, অন্যথায় অন্তর্নির্মিত পৃষ্ঠা {"detail": "Not Found"}
একটি পাথ সেগমেন্ট তার টীকাটির সাথে খাপ খায় না 404 একই পৃষ্ঠা {"detail": "Not Found"}
একটি ক্যোয়ারী, হেডার, কুকি বা বডি ফিল্ড অনুপস্থিত বা অবৈধ 422 FastAPI এর JSON বডি FastAPI এর JSON বডি
notFound() 404 পাতা {"detail": ...}
unauthorized() 401 অন্তর্নির্মিত পৃষ্ঠা {"detail": ...}
forbidden() 403 অন্তর্নির্মিত পৃষ্ঠা {"detail": ...}
raise HTTPException(409, ...) 409 অন্তর্নির্মিত পৃষ্ঠা {"detail": ...}
একটি ব্যতিক্রম কিছুই ধরা 500 errors.nexy, অন্যথায় অন্তর্নির্মিত পৃষ্ঠা {"detail", "reference"}
redirect(url) 307 গন্তব্য, পৃষ্ঠা নেই গন্তব্য, শরীর নেই
permanentRedirect(url) 308 গন্তব্য, পৃষ্ঠা নেই গন্তব্য

একটি API ক্লায়েন্ট হল একটি অনুরোধ যার Accept শিরোনাম JSON এর জন্য জিজ্ঞাসা করে এবং একটি পৃষ্ঠার জন্য নয়:

curl -H "Accept: application/json" http://localhost:3000/api/items/500# {"detail":"Out of range"}

ব্যর্থতা কোথা থেকে আসে

একটি অনুরোধ, চারটি প্রস্থান
Browser ──► Middleware ──► Router ──► Page or handler
                 │            │             │
                 │            │             ├─ return ───────────► 200
                 │            │             ├─ HTTPException ────► its status
                 │            │             └─ other exception ───► 500
                 │            └─ no match ────────────────────────► 404
                 └─ raises ──────────────────────────────────────► 500
মঞ্চ কি ব্যর্থ হতে পারে উত্তর
মিডলওয়্যার আপনার middleware.py, CORS, সেশন ব্যতিক্রমের অবস্থা, অন্যথায় 500
রাউটার URL কোনো ফাইলের সাথে মেলে না 404
বৈধতা একটি পাথ সেগমেন্ট রূপান্তর করা যাবে না 404
বৈধতা একটি ক্যোয়ারী, হেডার, কুকি বা বডি ফিল্ড 422
পৃষ্ঠা, হ্যান্ডলার, অ্যাকশন, গার্ড HTTPException এর অবস্থা
পৃষ্ঠা, হ্যান্ডলার, অ্যাকশন, গার্ড অন্য কিছু 500

যে কোন জায়গা থেকে চলে যান

redirect, permanentRedirect, notFound, forbidden এবং unauthorized একটি HTTP ব্যতিক্রম উত্থাপন করে, তাই একই কল একটি .nexy পৃষ্ঠা, একটি API হ্যান্ডলার, একটি মডুলার কন্ট্রোলার, একটি গার্ড, একটি dependencies.py এবং একটি অ্যাকশনে কাজ করে।

src/routes/posts/[slug].py
from nexy import notFound, redirect from src.posts import find  async def GET(slug: str):    post = find(slug)    if post is None:        notFound("No such post")    if post.moved_to:        redirect(post.moved_to)    return post
src/apps/posts/posts_by_slug_controller.py
from nexy import notFound, redirectfrom nexy.decorators import Controller from src.posts import find  @Controller("/posts/{slug}")class PostsBySlugController:    async def get(self, slug: str):        post = find(slug)        if post is None:            notFound("No such post")        if post.moved_to:            redirect(post.moved_to)        return post

রুট মডিউলের controllers কন্ট্রোলারের তালিকা করুন।

কল উত্তর কখন
notFound(detail=None) 404 সম্পদের অস্তিত্ব নেই
unauthorized(detail=None, scheme=None) 401 ভিজিটরকে প্রথমে সাইন ইন করতে হবে
forbidden(detail=None) 403 দর্শক পরিচিত কিন্তু এটি দেখতে নাও হতে পারে
redirect(url, status=307) 307 তাদের অন্যত্র পাঠান, পদ্ধতি বজায় রেখে
redirect(url, status=303) 303 একটি ফর্মের পরে: পরবর্তী অনুরোধটি একটি GET
permanentRedirect(url) 308 একটি সরানো পৃষ্ঠা যা সার্চ ইঞ্জিনের মনে রাখা উচিত

আপনার বিশ্বাসযোগ্য মানগুলি থেকে গন্তব্য তৈরি করুন। redirect(request.query_params["next"]) যেখানে লিঙ্ক বলে সেখানে দর্শকদের পাঠায়; এটি একটি খোলা পুনঃনির্দেশ। একটি লাইন বিরতি ধারণ করে এমন একটি গন্তব্য প্রত্যাখ্যান করা হয়েছে৷

বৈধতা: 422, বা 404

হ্যান্ডলার প্যারামিটারগুলি তাদের টীকাগুলির বিরুদ্ধে FastAPI দ্বারা যাচাই করা হয়।

src/routes/api/search.py
from nexy.http import Header  async def GET(q: str, limit: int = 10, x_token: str = Header(...)):    return {"q": q, "limit": limit}
src/apps/search/search_api_controller.py
from nexy.decorators import Controllerfrom nexy.http import Header  @Controller("/api/search")class SearchApiController:    async def get(self, q: str, limit: int = 10, x_token: str = Header(...)):        return {"q": q, "limit": limit}

রুট মডিউলের controllers কন্ট্রোলারের তালিকা করুন।

সমস্যা স্ট্যাটাস কেন
অনুপস্থিত বা অবৈধ ক্যোয়ারী, হেডার, কুকি বা বডি ফিল্ড 422 অনুরোধ হ্যান্ডলার পৌঁছেছে, তথ্য ভুল
অবৈধ পাথ সেগমেন্ট (/api/users/abc এর জন্য id: int) 404 ফোল্ডারে একটি নন-সংখ্যার জন্য কোন রুট নেই, তাই URLটি বিদ্যমান নেই

422 বডিটি FastAPI-এর আদর্শ আকৃতি, তাই ক্লায়েন্ট এবং জেনারেট করা SDK কাজ চালিয়ে যায়:

{"detail": [{"loc": ["query", "q"], "msg": "Field required", "type": "missing"}]}

একটি ফর্ম বা একটি কর্মের জন্য, ক্লায়েন্ট একটি ActionError status এবং detail সহ পায়; একটি 422 এছাড়াও প্রতি ক্ষেত্রে একটি বার্তা দিয়ে error.fields পূরণ করে। কর্ম দেখুন।

কাস্টম ত্রুটি পৃষ্ঠা

src/routes/notfound.nexy
<h1>Page not found</h1><p>The link may be old. <a href="/">Start from the home page</a>.</p>
src/routes/errors.nexy
<h1>Something went wrong</h1><p>Try again in a moment.</p>
ফাইল স্ট্যাটাস ব্যাপ্তি
src/routes/notfound.nexy 404 প্রকল্পের প্রতিটি রুট
src/routes/errors.nexy 500 প্রকল্পের প্রতিটি রুট
src/routes/forbidden.nexy 403 প্রকল্পের প্রতিটি রুট
src/routes/unauthorized.nexy 401 প্রকল্পের প্রতিটি রুট
src/routes/blog/notfound.nexy 404 /blog এবং নীচে
src/routes/blog/errors.nexy 500 /blog এবং নীচে
src/routes/loading.nexy - সংরক্ষিত, এখনও কোন রানটাইম প্রভাব

রুটের কোথাও একটি ফাইল তার স্থিতির জন্য উত্তর ইনস্টল করে: রুটে একটি অনুলিপি পুরো প্রকল্পের উত্তর দেয়, একটি ফোল্ডারের একটি অনুলিপি সেই ফোল্ডারটির উত্তর দেয় এবং URL এর সাথে মেলে এমন গভীরতম ফাইলটি জয়লাভ করে। প্রতিটি অনুলিপির বাইরে একটি URL, এবং কোনো ফাইল ছাড়াই একটি স্থিতি, অন্তর্নির্মিত স্টাইলযুক্ত পৃষ্ঠাগুলি পান৷ ফোল্ডার প্রতি ত্রুটি পৃষ্ঠাগুলি দেখুন।

মডুলার রাউটারের একটি ফাইলে কোনো ত্রুটির পৃষ্ঠা নেই: একটি 404, 500, 403 বা 401 বিল্ট-ইন স্টাইলযুক্ত পৃষ্ঠা পায়। ফোল্ডার প্রতি ত্রুটি পৃষ্ঠাগুলি ফাইল-ভিত্তিক রাউটারের একটি নিয়ম।

অব্যবহিত ব্যতিক্রম

একটি ব্যতিক্রম যে ধরা পড়া কিছুই একবার লগ করা হয় না, তার রেফারেন্স সহ, এটি কোথা থেকে এসেছে এবং এর চারপাশের কোড। অবস্থা হল 500, এবং শরীর পরিবেশের উপর নির্ভর করে।

nexy dev nexy build তারপর nexy start
ব্রাউজার ত্রুটি, আপনার কোডের লাইন এবং ট্রেসব্যাক errors.nexy, অন্যথায় একটি রেফারেন্স সহ অন্তর্নির্মিত পৃষ্ঠা
API ক্লায়েন্ট {"detail", "reference", "error"} {"detail", "reference"}
টার্মিনাল ব্যতিক্রম এবং আপনার কোড লাইন ব্যতিক্রম, পুরো ট্রেসব্যাক এবং রেফারেন্স
  x ZeroDivisionError: division by zero  GET /boom  ref fe6a5217    at src/routes/boom.py:2 in GET       1 | def GET():       2 |     return {"a": 1 / 0}

রেফারেন্সটি আটটি অক্ষর, প্রতিটি ব্যর্থতার জন্য নতুন। একজন দর্শক এটি উদ্ধৃত করতে পারেন, এবং আপনি এটির জন্য লগ অনুসন্ধান করে ট্রেসব্যাক খুঁজে পাবেন। ব্যতিক্রম বা কোডটিও উৎপাদনে দর্শকের কাছে পৌঁছায় না।

কর্ম এবং ফর্ম

একটি ক্রিয়া হল একটি POST শেষ বিন্দু যার একটি উৎপন্ন পাথ রয়েছে। এর ব্যর্থতা একই নিয়ম অনুসরণ করে:

পরিস্থিতি স্ট্যাটাস ক্লায়েন্ট
একটি ক্ষেত্র অনুপস্থিত বা অবৈধ 422 ActionError সাথে fields
HTTPException(403) কর্মে উত্থাপিত 403 ActionError status এবং detail সহ
একটি অনিয়ন্ত্রিত ব্যতিক্রম 500 ActionError; রেফারেন্সটি সার্ভার লগে রয়েছে
Origin শিরোনাম আরেকটি সাইট 403 অ্যাকশন চালানোর আগে প্রত্যাখ্যান করেছিল

কর্ম পথের পোস্ট ছাড়া একটি ফর্ম JavaScript; একটি সাফল্যের উত্তর 303 পৃষ্ঠায় ফিরে আসে, একটি ব্যর্থতা ত্রুটির পৃষ্ঠাটি দেখায়। দেখুন কর্ম।

একটি চেকলিস্ট যখন একটি পৃষ্ঠা ভুল উত্তর দেয়

  1. স্ট্যাটাস দেখুন, পেজ নয়। একটি কাস্টম notfound.nexy এখনও উত্তর দেয় 404।
  2. পড়ুন টার্মিনাল একটি পৃষ্ঠা যা আমদানি করতে ব্যর্থ হয় তা নিবন্ধিত নয়, তাই ফাইলটি বিদ্যমান থাকাকালীন এটির URL 404 উত্তর দেয়। আমদানি ত্রুটি লগে আছে।
  3. চেক করুন এক্সটেনশন useCSR = True সহ, .nexy পৃষ্ঠাগুলি সার্ভার মোডের অন্তর্গত; ভুল মোডে একটি পৃষ্ঠা একটি রুট নয়।
  4. চেক করুন গভীরতা একটি notfound.nexy বা errors.nexy শুধুমাত্র তখনই কাজ করে যখন রুট কপি বিদ্যমান থাকে।
  5. আপনার API ক্লায়েন্ট প্রাপ্ত আকৃতি দেখতে Accept: application/json সহ JSON এর জন্য জিজ্ঞাসা করুন।
  6. আপনি একটি সমস্যা খুললে বা লগ অনুসন্ধান করার সময় একটি 500 এর রেফারেন্স উদ্ধৃত করুন।

পরবর্তী পদক্ষেপ

GitHub-এ সম্পাদনা করুন

Enter ফলাফল খোলে, Esc বন্ধ করে।