现在我们开发了一个简单的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")
转载于:https://blog.51cto.com/freshair/1927408