一:Flask处理请求和回复
Flask和Werkzeug提供了request和response对象去处理请求和回复的数据。Flask通过@app.route包裹的函数(后面我们称这个函数叫做视图函数),来响应请求。
视图函数返回的值可以分为三类:
string:返回的就是普通的字符串。
一个response的实例:具备HTTP属性的一个响应的对象的实例。通过make_respone来构建
一个元组:(string,status)或者(string,status,http_headers)这样的结构,对于这种方式很方面不需要创建response的实例。
下面是这三种方式的例子:
# encoding=utf-8
from flask import Flask,make_response
app = Flask(__name__)
@app.route("/string/")
def return_string():
return "Hello,world"
@app.route("/object/")
def return_object():
headers={'Content-Type':'text/plain'}
return make_response('Hello,world',200,headers)
@app.route("/tuple/")
def return_tuple():
return "hello,world",304,{'Content-Type':'text/plain'}
三种方式的总结:
方式一: 最简单,最常用,后面可借助模板引擎输出html,但是不可以定制响应。
方式二:灵活性强,可对响应报文进行定制,定制status等等,但是需要创建一个response的实例
方式三: 具备方式二的优点,并且简单明了。
二:Flask request对象详解
通过下面的一个例子全面的去了解flask中的request对象:
# encoding=utf-8
from flask import Flask,request
app = Flask(__name__)
def dump_request_detail(request):
request_detail="""
request.endpoint:{request.endpoint}
request.method:{request.method}
request.view_args:{request.view_args}
request.args:{request.args}
request.form:{request.form}
request.user_agent:{request.user_agent}
request.files:{request.files}
request.is_xhr:{request.is_xhr}
{request.headers}""".format(request=request).strip()
return request_detail
@app.before_request
def call_me():
app.logger.debug(dump_request_detail(request))
@app.after_request
def call_me(response):
app.logger.debug("#After Request#\n"+repr(response))
return response
@app.route("/string/")
def return_string():
return "Hello,World"
上面这个程序会通过app.logger.debug开启日志调试,通过在dos窗口下可以看下日志输出的信息。
重点介绍下before_request这个装饰器,这个装饰器包裹下的函数会在每次request前执行。
after_request会在每次request结束后执行。但是有一个情况就是如果一个request没有正常结束的话,那么after_request下包裹的函数是不会执行的。
那么就有另外一个装饰器teardown_request,这个装饰器无论请求是否正常结束都会执行的。
接下来开始运行上面的应用,并查看DOS窗口下的输出信息。
到此本节到此结束,更多知识还需要读者自己 进一步去了解。