[WeGit 微信小程序 7th] 小程序后端项目结构和框架
项目地址: https://github.com/mirrorhanyu/WeGit
扫码体验
WeGit-api ├── Dockerfile ├── go.sh ├── main.py ├── requirements.txt ├── settings.py ├── database │ ├── models │ ├── database_helper.py │ ├── database_initializer.py │ ├── database_engine.py ├── decorators ├── deploy ├── migration ├── notifications ├── rest │ ├── developer.py │ ├── health_check.py │ ├── language.py │ ├── repository.py │ └── search.py └── utils
整体项目可以从 Dockerfile 开始往里查看
FROM frolvlad/alpine-python3 RUN apk add --update alpine-sdk libxslt-dev libffi-dev libxml2-dev openssl-dev postgresql-dev python3-dev RUN pip3 install virtualenv WORKDIR /app COPY ./ /app EXPOSE 5000 CMD ["sh", "go.sh"]
Dockerfile 定义基于 frolvlad/alpine-python3 基础镜像,并 install virtualenv,提供隔离的 python 环境。然后把项目代码拷贝到镜像,当镜像run起来会最终执行入口文件 go.sh
那么我们去 go.sh 文件里看看
function run { setUp migrate gunicorn -w 4 -b 0.0.0.0:5000 main:app } run
setup 配置 python 环境,并 pip install 需要的依赖。
migrate 管理数据库的 Schema 迁移
最后用 gunicorn host 整个 flask application。
这里没有采用 flask 内置的 server,是因为 flask run 内置的 server 是开发版,不够高效,稳定和安全。
更多细节可参考:
Deploy Flask to Production
Standalone WSGI Containers
可以看到 flask application 其实是定义在 main:app 中,让我们再去看看 main.py 里的 app 是什么。
app 其实就是一个 Flask 实例, 通过 register_blueprint 注册加载路由。
同时,flask 还提供很多 decorations,比如 @errorhandler,@after_request 注册(Registering)对应事件的处理逻辑(Handling)
当 request 进来到 flask application 中,对应路由的 handler 会有相应的处理逻辑,然后返回 response 给消费端。
如果请求链路中出错,或者请求结束,注册过 @errorhandler,@after_request 的 handlers 会做相应的处理。
decorates
这里采用 functors,以项目中一个代码片段为例,
def require_requests_session(func): @functools.wraps(func) def wrapper(*args, **kwargs): requests_session = requests.Session() requests_session.hooks.update({ 'response': [log_request_and_response, raise_for_status] }) return func(*args, **kwargs, requests_session=requests_session) return wrapper
这里提供了一个 @require_requests_session 的装饰器。
首先获取 requests 的 session 实例,然后加上 requests 包提供的 hook,当获取到 response 的时候,打印 request 和 response 的具体内容,并且 raise exception 当 response status code 不是 200 的时候。
装饰上 @require_requests_session 的函数会额外接收一个名为 requests_session 的参数。可以用这个加上 hook 的 session 去做请求。会在请求结束时完成打印,和验证请求结果。