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

 

posted @ 2019-04-16 11:05  无涯(WuYa)  阅读(519)  评论(0编辑  收藏  举报