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, 这些在模板中可能会用到)
- 返回上下文 (不用封装叶涛提供)
- 请求对象(后端框架使用的request对象,在
- 模板文件自动寻址
- 静态文件寻址
- 模板异常处理
同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.year
今天的文章Python-FastAPI 异步博客开发(二) 通信逻辑篇分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/66330.html