现在我们开发了一个简单的Flask小程序,知道用户在浏览器中输入一个URL对应到哪个视图函数进行处理。那么问题来了,怎么去进行处理一些比较复杂的业务逻辑呢?

一、程序上下文
1、整个app范围,也就是说是全局的(程序级别)的上下文
怎么理解这个上下文呢?就是在所有的这个请求当中,我们共享的是同一块内存
#coding:utf-8
from flask import Flask, session, request
app = Flask(__name__)

@app.route("/")
def index():
    '''首页'''
    user = session.get("user",None)
    # 如果用户已经登录,此处打印用户消息
    print("user in index: %s") % user
    return "Hello World!"

@app.route("/login/<user>/")
def login(user):
    '''模拟登录'''
    session["user"] = user
    # 将用户信息存入到session
    print("login user: %s") % user
    return "login success"

@app.route("/logout/")
def logout():
    '''模拟登出'''
    user = session["user"]
    print("logout user:%s") % user
    # 将用户信息从session删除
    session["user"] = None
    return "logout success"

#使用session必须要设置改key,随机的字符串即可
app.secret_key = "A0Z98/dfDER747#O%^!/,<87UHRHF"

if __name__ == "__main__":
    app.run(debug=True,host="0.0.0.0")


2、请求上下文
#coding:utf-8
from flask import Flask, request
app = Flask(__name__)

@app.route("/")
def index():
    #打印请求来源信息
    agent = request.headers.get("User-Agent",None)
    return "From:%s" % agent

@app.route("/head")
def head():
    headers = request.headers
    response = ""
    for k, v in headers.items():
        response += "%s: %s</br>" % (k,v)
    return response

if __name__  == "__main__":
    app.run(debug=True,host="0.0.0.0")


二、请求的调度(就是去限制一些请求)
#coding:utf-8
from flask import Flask, request
app = Flask(__name__)

@app.route("/", methods=['POST']) #只能post方式访问
def index():
    #打印headers信息
    agent = request.headers.get('User-Agent',None)
    return "From: %s" % agent

@app.route("/data/", methods=['GET','POST','HEAD','OPTIONS'])
def data():
    '''
    处理不同类型的请求
    curl -i -X POST "http:/127.0.0.1:5000/data/"
    curl -i -X GET "http:/127.0.0.1:5000/data/"
    curl -i -X OPTIONS "http:/127.0.0.1:5000/data/"
    '''
    #处理post请求
    if request.method == "POST":
        return "From Post"
    elif request.method == "GET":
        return "From GET"
    return "From other"
if __name__  == "__main__":
    # print(app.url_map)
    app.run(debug=True,host="0.0.0.0")
    

三、请求之前做一些事情,请求完之后做一些事情
#coding:utf-8
from flask import Flask, session, request
app = Flask(__name__)

@app.route("/")
def index():
    '''首页'''
    user = session.get("user",None)
    # 如果用户已经登录,此处打印用户消息
    print("user in index: %s") % user
    return "Hello World!"

@app.route("/login/<user>/")
def login(user):
    '''模拟登录'''
    session["user"] = user
    # 将用户信息存入到session
    print("login user: %s") % user
    return "login success"

@app.route("/logout/")
def logout():
    '''模拟登出'''
    user = session["user"]
    print("logout user:%s") % user
    # 将用户信息从session删除
    session["user"] = None
    return "logout success"

@app.route("/error/")
def get_error():
    '''触发异常'''
    raise

@app.before_request
def beforce_request():
    '''在每个请求之前执行'''
    print(">>>>>>>>>>>starting...")
    
@app.after_request
def after_request(response):
    '''如果没有未处理的异常抛出,在每次请求之后运行'''
    print(">>>>>>>>>>>ending...")
    return response

@app.teardown_request
def teardown_request(exception):
    '''即使有未处理的异常抛出,也在每次请求之后运行'''
    print("#############teardown###############")    
    
#使用session必须要设置改key,随机的字符串即可
app.secret_key = "A0Z98/dfDER747#O%^!/,<87UHRHF"

if __name__ == "__main__":
    app.run(debug=True,host="0.0.0.0")
    
    

五、请求的响应
#coding:utf-8
from flask import Flask, request,make_response, redirect, url_for, abort
app = Flask(__name__)

@app.route('/')
def index():
    #打印请求来源信息
    return "<h1>Bad Request</h1>", 400

@app.route("/test/")
def test():
    """在response中设置其他值"""
    # 打印headers信息
    response = make_response("<h1>this document carries a cookie!</h1>")
    # 设置一个cookie
    response.set_cookie('answer','right')
    return response
    
@app.route("/go/")
def go_where():
    """重定向"""
    #重定向到百度
    # return redirect("http://www.baidu.com")
    #重定向到test页面
    return redirect(url_for("test"))
    
@app.route("/down/")
def down():
    """直接返回状态码"""
    # abort(404)
    abort(500)
    
if __name__ == "__main__":
    app.run(debug=True,host="0.0.0.0")