[WeGit 微信小程序 7th] 小程序后端项目结构和框架

583 阅读2分钟

项目地址: github.com/mirrorhanyu…

扫码体验

mini-program-qrcode

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 去做请求。会在请求结束时完成打印,和验证请求结果。