框架

成熟的 web 框架还需要下面几部分。

1 对 environ 做一些预处理,把 request 暴露出来供应用开发者调用。在一部分 wsgi 框架中 request 被直接注入到路由函数当中。

from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello, world.")

而像 flask 和 bottle 类似的框架,request 是一个线程安全的全局变量,需要主动引入。

from flask import request

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        do_the_login()
    else:
        show_the_login_form()

2 对 response 对象做一些封装以方便应用端返回结果,WSGI 服务端要求每次返回结果时一定要调用服务端发来的 start_response 对象。这很麻烦,框架可以实现一些封装,把这部分逻辑隐藏掉,比如 flaks 提供了一个 Response 对象。

def index():
   response = Response("Unicorns are OK")
   response.headers['X-Parachutes'] = 'parachutes are cool'
   response.set_cookie('username', 'the username')
   return response

3 提供更方便的路由处理方法,框架需要处理浏览器发来的查询参数,比如 http://localhost:8080/orders?confirmed=true&processor=tony. 框架需要很方便地让应用开发者查询的到 confirmed 参数和 processor 参数是什么。

4 cookie,session 处理能力。

5 某些框架还提供了 html template 的功能,比如 flask 里集成的 jinja。在前后分离的 web 开发浪潮中 template 不是后端框架必须提供的。

6 还可以添加 orm 抽象层去处理数据库增删改查,比如 Django ORM。