北京 设计 网站建设今天莱芜大事件新闻最新消息
2026/4/11 17:22:04 网站建设 项目流程
北京 设计 网站建设,今天莱芜大事件新闻最新消息,wordpress调用文章tag,wordpress文章图片插件一、基本介绍基础定义 业界常用开发模型 /src目录#xff1a;存放核心应用代码。其下可细分多个子模块#xff1a; models子目录#xff1a;存放数据库模型定义routes子目录#xff1a;管理FastAPI路由配置services子目录#xff1a;封装业务逻辑层 /tests目录#xff1a…一、基本介绍基础定义业界常用开发模型/src目录存放核心应用代码。其下可细分多个子模块models子目录存放数据库模型定义routes子目录管理FastAPI路由配置services子目录封装业务逻辑层/tests目录将测试代码与主应用隔离便于测试管理并确保生产构建不包含测试代码/docs目录集中存放API文档、安装指南及使用说明等关键文档资源异步兼容# 异步函数应仅用于I/O密集型操作数据库查询、HTTP请求等app.get(/)asyncdefread_root():return{Hello:World}端点端点是API交互的接入点。在FastAPI中通过HTTP方法装饰器如app.get(/)创建端点表示应用根路径的GET请求处理器fromfastapiimportFastAPI appFastAPI()# 当向根URL(/)发起GET请求时read_root函数被调用并返回JSON响应app.get(/)asyncdefread_root():return{Hello:World}路由当需要管理跨文件的多个端点时路由机制尤为重要。路由将端点分组到不同模块大幅提升代码可维护性与可读性例如用户操作路由与产品操作路由分离。# 创建路由 router_example.pyfromfastapiimportAPIRouter routerAPIRouter()router.get(/items/{item_id})asyncdefread_item(item_id:int):return{item_id:item_id}# 挂载路由 main.py# 路由模块应遵循单一职责原则按业务域垂直拆分importrouter_examplefromfastapiimportFastAPI appFastAPI()app.include_router(router_example.router)app.get(/)asyncdefread_root():return{Hello:World}uvicorn main:app --reload#--reload参数使服务器在代码变更后自动重启是开发环境的理想选择# 生产环境则应使用--workers参数配置多进程uvicorn main:app --reload --host192.168.31.158# 限制运行在特定的IPhttp://127.0.0.1:8000 http://127.0.0.1:8000/docs http://127.0.0.1:8000/redoc书店系统案例后端雏形# 书店系统后端雏形fromfastapiimportFastAPI appFastAPI()# {book_id}是路径参数 用来动态传递值app.get(/books/{book_id})# book_id: int 执行了数据验证 防御常见注入攻击asyncdefread_book(book_id:int):return{book_id:book_id,title:The Great Gatsby,author:F. Scott Fitzgerald}[!NOTE]RESTful API 资源标识规范REST 是面向资源的路径应表示资源而不是操作。不推荐/getBook/{id}、/deleteUser/{userId}推荐/books/{book_id}、/users/{user_id}路径本身表示资源集合/books或具体资源/books/123操作由 HTTP 方法GET/POST/PUT/DELETE表达。使用小写、下划线或短横线分隔推荐短横线-推荐/books/{book-id}或直接/books/{id}路径参数名应简洁避免冗余既然路径已经是/books/...那么参数名无需重复 “book”冗余/books/{book_id}简洁/books/{id}这是 RESTful 设计中的通用惯例。例如 GitHub API 使用/repos/{owner}/{repo}而不是/repo/{repo_owner}/{repo_name}。使用复数形式表示资源集合/books资源集合/books/123具体资源实例标识符应为不透明的opaque且稳定使用数据库主键如整数123或全局唯一 ID如 UUIDa1b2c3d4。不应暴露内部结构如/books/user123_book456。一旦分配不应改变避免破坏链接。参数处理# 路径参数适用于资源标识如/users/{user_id}# 新增路径参数端点 用于检索作者信息app.get(/authors/{author_id})# 通过Python类型提示(author_id: int)自动执行参数验证与转换asyncdefread_author(author_id:int):return{author_id:author_id,name:Ernest Hemingway}查询参数用于细化或定制API端点的响应以问号(?)后追加的形式出现在URL中。例如/books?genrefictionyear2010可能仅返回2010年出版的虚构类书籍。为现有端点添加查询参数。假设我们需要允许用户按出版年份过滤书籍# 查询参数适用于资源过滤如?statusactive和分页控制如?page2size10以问号(?)后追加的形式出现在URL中# 例如 /books?genrefictionyear2010# 添加查询参数app.get(/books)# 此时year可选,None明确表示参数可缺失asyncdefread_books(year:intNone):ifyear:return{year:year,books:[Book 1,Book 2]}return{books:[All Books]}模型定义基础模型frompydanticimportBaseModelclassBook(BaseModel):# 每个字段都有类型声明title:strauthor:stryear:int请求体# 定义请求体frommodelsimportBook# Pydantic模型也用于请求体的结构定义# 当用户向 /book 发送包含JSON数据的POST请求时FastAPI会自动解析并验证数据是否符合Book模型。若数据无效将返回自动化的错误响应app.post(/book)asyncdefcreate_book(book:Book):returnbook# 高级验证功能frompydanticimportBaseModel,FieldclassBook(BaseModel):# 最小长度1个字符 最大长度100 个字符title:strField(...,min_length1,max_length100)author:strField(...,min_length1,max_length50)# 大于1900 小于2100year:intField(...,gt1900,lt2100)响应模型frompydanticimportBaseModel# 定义响应模型# 响应模型分离设计遵循最小权限原则避免意外泄露敏感字段classBookResponse(BaseModel):title:strauthor:str# /allbooks GET端点需要返回图书列表但仅包含书名和作者app.get(/allbooks)# list[BookResponse] 表示使用BookResponse模型处理响应 保证响应只有两个属性asyncdefread_all_books()-list[BookResponse]:return[{title:1984,author:George Orwell},{title:The Great Gatsby,author:F. Scott Fitzgerald},]# 在端点装饰器参数中指定响应类型# response_model参数具有更高优先级app.get(/allbooks,response_modellist[BookResponse])asyncdefread_all_books():# 端点实现内容异常处理Http错误处理fromfastapiimportFastAPI,HTTPExceptionfromstarlette.responsesimportJSONResponse# http_exception_handler函数将处理所有HTTPException错误。app.exception_handler(HTTPException)asyncdefhttp_exception_handler(request,exc):returnJSONResponse(status_codeexc.status_code,content{message:Oops! Something went wrong},)# 测试用端点 显式抛出HTTP错误响应app.get(/error_endpoint)asyncdefraise_exception():raiseHTTPException(status_code400)验证错误处理importjsonfromfastapiimportRequest,statusfromfastapi.exceptionsimportRequestValidationErrorfromfastapi.responsesimportPlainTextResponse# 捕获所有RequestValidationError错误 并返回包含错误详情的纯文本响应app.exception_handler(RequestValidationError)asyncdefvalidation_exception_handler(request:Request,exc:RequestValidationError):returnPlainTextResponse(This is a plain text response:f \n{json.dumps(exc.errors(),indent2)},status_codestatus.HTTP_400_BAD_REQUEST,)

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询