Flask生成响应(四)
在Flask的应用程序中,客户端向服务端的应用程序发送了请求后,服务端解析客户端的
请求后,会把响应内容返回给客户端。在Flask的应用程序中,响应主要使用Response来处理,
响应报文中的内容由服务器处理。在前面的知识体系中可以知道,在Flask应用程序中,在客户
端发送请求地址后,URL的路由地址找到具体的视图函数,在视图函数中会对客户端的请求进行
处理,除非请求的地址在视图函数中找不到,就会返回404的内容。
这里我们就以302重定向为案例来讲解,在一个系统中,比如访问用户的主页,大家知道访问
用户的主页前提是必须登录成功,如果不登录不能被访问用户的主页,见实现的案例源码:
from flask import Flask,request,render_template,url_for,redirect app = Flask(__name__) app.config.from_pyfile('config.py',silent=True) @app.route('/login/') def login(): return render_template('login.html') @app.route('/profile/') def profile(): name=request.args.get('name',None) if name: return '无涯个人主页' else: return redirect(url_for('login')),302 if __name__ == '__main__': app.run()
在上面的案例代码中,启动服务后,在浏览器访问http://localhost:5000/profile/就会跳转到/login/的页面
并且返回的HTTP协议的状态码是302,如下图所示。
在HTTP的协议中,它的请求流程为:
当然在实际的案例中,生成相应返回的数据某些时候是字典这些,需要jsonify来单独的进行处理下,
如下面的案例代码:
from flask import Flask,request,render_template,url_for,redirect,jsonify app = Flask(__name__) app.config.from_pyfile('config.py',silent=True) datas={'status':0,'msg':'账户返回的信息错误','datas':{'name':'wuya','age':18}} @app.route('/res/') def res(): return jsonify(datas) if __name__ == '__main__': app.run()
这里结合requests的数据来进行结合案例说明,请求一个接口,把响应的数据拿回后,然后在响应数据中返回,
具体实现的代码如下:
from flask import Flask,request,render_template,url_for,redirect,jsonify app = Flask(__name__) app.config.from_pyfile('config.py',silent=True) import requests @app.route('/weather/') def weacher(): r=requests.get(url='http://www.weather.com.cn/data/cityinfo/101010100.html') return jsonify(r.json()) if __name__ == '__main__': app.run()
执行如上的代码后,返回的响应数据在解析后,它的数据类型是flask.wrappers.Response,见打印后的内容,
如下图所示。
在Flask的应用程序中,客户端发送请求后,服务端会回应客户端的请求,客户端的每次请求都不一定能够
成功,服务端可能返回的其他各种情况下的错误码。下面结合具体的案例来看这些错误码。很多时候Flask的是
能够自己独立处理错误信息的,这些错误信息是在werkzeug.expections模块中定义,但是也可以手动的进行处
理,手动处理需要导入abort。首先来看404的错误码,客户端发送请求,但是请求的资源不存在,会发生404
的错误。见案例代码:
from flask import Flask,request,render_template,url_for,redirect,jsonify,abort app = Flask(__name__) app.config.from_pyfile('config.py',silent=True) @app.route('/404/') def found(): abort(404) if __name__ == '__main__': app.run()
执行程序后,在浏览器访问,服务端返回404的错误信息,如下图服务端返回的错误信息。
在HTTP的请求中,服务端返回给客户端的数据是多种格式的,大多数情况下,一般会使用HTML
的格式或者是基于JSON的数据,当然某些情况下,这个具体需要看响应头中的Content-Type。HTML
的格式,Content-Type一般是:text/html;charset=utf-8,如果是JSON格式的,Content-Type是:application/
json;charset=utf-8。在Flask中提供了make_response()方法来生成响应对象,传入响应主体,然后通过
mimetype来设置MIME的类型。见案例实现的代码:
from flask import Flask,request,render_template,url_for,redirect,jsonify,abort from flask import make_response app = Flask(__name__) app.config.from_pyfile('config.py',silent=True) @app.route('/f1/') def f1(): r=make_response('Hello,无涯') r.mimetype='text/html' return r if __name__ == '__main__': app.run()
启动程序后,客户端请求后,服务端会返回客户端的数据,然后它的Content-Type是:text/html;charset=utf-8。
结合之前的接口请求案例,来看JSON的数据格式,见实现的源码:
from flask import Flask,request,render_template,url_for,redirect,jsonify,abort from flask import make_response app = Flask(__name__) app.config.from_pyfile('config.py',silent=True) import requests import json @app.route('/weather/') def weacher(): r=requests.get(url='http://www.weather.com.cn/data/cityinfo/101010100.html') data=r.json() response=make_response(json.dumps(data)) response.mimetype='application/json' return response if __name__ == '__main__': app.run()
执行后,见返回的响应头的数据,见如下:
其实在前面也介绍到jsonify的应用,对返回的数据进行处理,它默认返回的是200,如果不是就需要对应
错误码的提示,如案例代码:
from flask import Flask,request,render_template,url_for,redirect,jsonify,abort from flask import make_response app = Flask(__name__) app.config.from_pyfile('config.py',silent=True) datas={'status':0,'msg':'账户返回的信息错误','datas':{'name':'wuya','age':18}} @app.route('/res/') def res(): return jsonify(datas,message='返回的错误信息失败'),500