Python-FastAPI 异步博客开发(二) 通信逻辑篇

本文介绍了使用Python FastAPI开发博客时的通信逻辑,包括模板技术、前后端分离、Mako模板的使用,以及CRUD操作中的认证机制。重点讲解了JWT用于管理员认证和Session实现的访问认证。同时,探讨了FastAPI如何处理异步操作,确保数据一致性。
摘要由CSDN通过智能技术生成

Frodo的第一个版本已经实现了,在下一个版本前,我将目前的开发思路整理成三篇文章,分别是数据篇、通信篇、异步篇。

博客地址

项目地址

本篇就来到实现具体功能的逻辑流程了,在Web应用汇总,我个人更倾向于将业务流程成为「通信」。因为是整个流程就是后台将数据组织加工发往前端,这个过程协议可以不同(http(s), websocket), 方法可能不同(rcp, ajax, mq), 返回的内容格式不同(json, xml, html(templates), 早年的Flash等); 刚才讲的是前后台通信,其实逻辑模块间、进程间甚至是后续的容器间都涉及到通信的问题。本篇先介绍Web通信的核心,前后台通信。

模板技术与前后端分离

  • 模板技术: 本世纪头十年广泛采用的Web技术,他有更有名的称呼MVC模式。核心思想是在html模板中使用后端代码写入数据,模板引擎会将渲染后html返回。Django内嵌了这种技术,python其他框架需要依赖jinjia,Mako等单独模板。其他语言如java的JSP也是采用此模式。他的特点是操作直接,直接在需要的地方写对应的数据。还可以直接使用后端语言在页面写逻辑,开发速度快。但缺点也很明显,前后端严重耦合,维护困难,不适合大型项目。

    • 协议: http
    • 方法: 均可
    • 内容: html(templates)
  • 前后端分离: 当下主流模式,当项目越来越大,前端工程化的需求催生了webpack工具。随后Vue,React,Angular框架专注MVVC模式,也就是只向后端拿数据,渲染和业务逻辑放进前端框架中。这样前后端开发人员可以最大程度的分离。

    • 协议:均可
    • 方法: 均可
    • 内容: json/xml

Mako模板和他的朋友FastAPI-Mako

Frodo使用模板来做博客的展示前台,考虑的是这部分页面少、逻辑简单、后端人员方便维护,模板完全够用。没有过时的技术,只有合不合适的技术

Mako是python主流模板之一,他的原生接口其实可以直接使用,但有些重复的逻辑需要我们包装一下:

  • 模板中固定需要的几个上下文变量
    • 请求对象(后端框架使用的request对象,在Flask,Django,fastapi中都存在),模板需要用到他的一些方法和属性,如反向寻址request.url_for(), request.host,甚至是request.Session中的内容
    • 请求上下文 context (主要指body,接触过Web开发的朋友都能列举出主要的请求体:Formdata, QueryParam, PathParam, 这些在模板中可能会用到)
    • 返回上下文 (不用封装叶涛提供)
  • 模板文件自动寻址
  • 静态文件寻址
  • 模板异常处理

Flask一样,fastapi的路由也是函数式的,为了将上述模板功能封装进路由函数,直接的做法是借助python的装饰器。最终高达到下述的效果:

from fastapi import APIRouter, Request, HTTPException
from fastapi.responses import HTMLResponse
from models import cache, Post
from ext import mako

@router.get('/archives', name='archives', response_class=HTMLResponse)
@mako.template('archives.html') # 指定模板文件名称
@cache(MC_KEY_ARCHIVES)
async def archives(request: Request): # 需要显示地传递 Request
    post_data = await Post.async_filter(status=Post.STATUS_ONLINE)
    post_obj = [Post(**p) for p in post_data]
    post_obj = sorted(post_obj, key=lambda p: p.created_at, reverse=True)
    rv = dict()
    for year, items in groupby(post_obj, lambda x: x.created_at
FastAPI 是一种基于 Python 的现代、快速(高性能)、异步框架,用于构建 Web 应用程序和服务。它是由 Starlette 和 Pydantic 这两个库共同支持的核心组件组成,并使用了 Tornado 和 uWSGI 等底层网络库提供高性能。 ### 快速搭建 FastAPI 项目: #### 步骤 1:安装依赖 首先需要安装 FastAPI 及其相关的依赖项。通过 `pip` 安装 FastAPI 及其依赖,命令如下: ```bash pip install fastapi uvicorn[standard] ``` 这里 `uvicorn` 是 FastAPI 默认使用的 WSGI 服务器,通过 `standard` 参数安装可以利用多线程或异步功能。 #### 步骤 2:创建基本结构 创建一个新的文件夹作为你的项目目录,并在其中初始化一个名为 `main.py` 的文件,这是你将编写应用逻辑的主要入口点。同时,在根目录下创建一个 `app` 文件夹存放应用模块,例如: ```bash mkdir my_fastapi_app cd my_fastapi_app touch main.py app/my_routes.py ``` #### 步骤 3:编写应用代码 在 `main.py` 中导入 FastAPI 并创建应用实例: ```python from fastapi import FastAPI app = FastAPI() @app.get("/") async def read_root(): return {"Hello": "World"} ``` 这个例子中最简单的路由处理函数会返回一个 JSON 格式的响应。 #### 步骤 4:添加路由 你可以在这个文件中或者在其他模块中添加更多的路由。比如在 `my_routes.py` 中添加一个用户注册的端点: ```python from fastapi import APIRouter router = APIRouter() @router.post("/users/") async def create_user(user_data: dict): # 这里通常会涉及数据库操作或其他业务逻辑 return {"message": f"User {user_data} created."} # 将路由器附加到主应用上 app.include_router(router) ``` #### 步骤 5:运行应用 使用 `uvicorn` 来启动你的应用: ```bash uvicorn main:app --reload ``` 这条命令会在本地的 `http://localhost:8000` 上运行你的应用。如果你想要访问新添加的用户注册端点,你可以通过浏览器访问 `http://localhost:8000/users/` 并传入数据。 #### 相关问题: 1. **如何配置日志系统** - FastAPI 提供了一个内置的日志框架,允许你轻松地集成外部日志库如 `logging` 或者 `loguru`。 2. **如何使用 FastAPI 与其他服务通信** - 利用 FastAPI异步特性,你可以方便地使用 HTTP 客户端(如 `aiohttp`)与其他外部服务进行通信。 3. **如何测试 FastAPI 应用** - 使用 Pytest 结合 FastAPI 自带的测试框架 `fastapi.testclient`,可以帮助你进行单元测试和集成测试。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值