flask教程5:abort函数、自定义错误、 视图函数的返回值


一、abort()函数的使用

      abort()函数可以立即终止视图函数的执行,并返回前端特定的信息,其方法可分为两种:

1.传递状态码信息

状态码(必须是标准的http状态码),示例如下:

from flask import Flask, Response, abort

app = Flask(__name__)


@app.route("/login", methods=["GET"])
def get_login():
    name = " "
    pwd = " "
    if name != "zhangsan" and pwd != "123456":
        abort(400)

    # abort()会终止视图函数的执行,return不会执行
    return "login success"


if __name__ == '__main__':
    app.run(host="127.0.0.1", port=8000, debug=True)

2.传递响应体消息

使用这种方式需要导入Response库,通过
from flask import Response进行导入,示例如下:

from flask import Flask, Response, abort

app = Flask(__name__)

@app.route("/login",methods=["GET"])
def get_login():
    name = " "
    pwd = " "
    if name != "zhangsan" and pwd != "123456":
        resp = Response("login fail") #接收字符串
        abort(resp)

    # abort()会终止视图函数的执行,return不会执行
    return "login success"

if __name__ == '__main__':
    app.run(host="127.0.0.1", port=8000, debug=True)

二、自定义错误处理 app.errorhandler

      在默认的http请求中,如果没有进行特别的自定义需求,那么出现404错误之类的,则会显示Not Found等信息。

      如果需要在发生错误的时候,再进行一系列的业务处理,这时候就可以使用自定义的错误处理方法。

# 定义错误处理的方法
@app.errorhandler(404)
def handle_404_error(err):
    """自定义的处理错误方法"""
    # 这个函数的返回值会是前端用户看到的最终结果
    return "出现了404错误, 错误信息:%s" % err

示例

from flask import Flask, request, abort

# 实例化app
app = Flask(import_name=__name__)

@app.route('/login', methods=["GET","POST"])
def login():

    user_name = ''
    user_pwd = ''

    if user_name != '余' and user_pwd != '123':
        abort(404)

    return "login sucess"

# 定义错误处理的方法
@app.errorhandler(404)
def handle_404_error(err):
    """自定义的处理错误方法"""
    # 这个函数的返回值会是前端用户看到的最终结果
    return "出现了404错误, 错误信息:%s" % err

if __name__ == '__main__':
    app.run(debug=True)
如果输入一个不存在的网址

三、设置响应信息

      设置响应信息的方法有两种,一是使用元祖,返回自定义的响应信息;二是使用make_response方法来构造响应体信息,以下来进行描述:
      

1.使用元祖,返回自定义的响应信息

from flask import Flask

app = Flask(__name__)

@app.route("/index")
def index():
    # 1.使用元祖,返回自定义的响应信息
    # 响应信息:响应体,状态码,响应头
    return ("hello world", 404 ,[("name","zhangsan"),("age","18")])

if __name__ == '__main__':
    app.run(debug = True)

![在这里插入图片描述](https://img-

此外,响应头可以由列表改成字典的方式进行传递如下:

return ("index page", 666 , {"itcast":"python","city":"shenzhen"})

状态码的设置可以进行修改,同时也可进行提示语的标注(不可添加中文,会报错),例如:

return ("index page", "404 hello" ,[("itcast","python"),("city","shenzhen")])

      

2.使用make_response方法来构造响应体信息

      这里要先导入make_response库,例如:

from flask import Flask,make_response

from flask import Flask,make_response

app = Flask(__name__)

@app.route("/index")
def index():

    # 2.使用make_response 来构造响应体信息
    response = make_response("hello world") # 构造响应体
    response.status = "404" # 构造状态码
    response.headers["name"] = "zhangsan" # 定义响应头
    response.headers["age"] = "18"
    return response

if __name__ == '__main__':
    app.run(debug = True)

四、返回json数据的方法

在Flask中直接返回list或dict是不行的

HTTP返回json格式数据主要有两个方面:

  • 数据本身为json格式;

  • Content-Type声明为json格式。

使用json 库

首先简单了解一下json库,这个库有两个常用的方法

 json.dumps(字典)    将python的字典转换为json字符串
 json.loads(字符串)  将字符串转换为python中的字典

这样当访问时即能够正常得到json数据。但这么做有一个缺点,就是HTTP返回的Content-Type仍然是text/html,即HTTP认为内容是HTML。

在上面的解决方法上作一个加强,手动指定其Content-Type为application/json,通常采用的是修改Flask中的Response模块:

from flask import Flask
from flask import Flask , Response
import json

app = Flask(__name__)

@app.route("/index")
def index():
    # 返回json数据的方法
    data = {
        "name":"zhangsan",
        "age":18
    }

    #response = json.dumps(data)  # 将python的字典转换为json字符串
    #return response,200,{"Content-Type":"application/json"}
    return Response (json.dumps(data), mimetype = 'application/json' )


if __name__ == '__main__':
    app.run(debug = True,port=5000)

使用jsonify库

2.通过导入jsonify库帮助转为json数据,并设置响应头 Content-Type 为 application/json

from flask import Flask,jsonify
import json

app = Flask(__name__)

@app.route("/index")
def index():
    # 返回json数据的方法
    data = {
        "name":"zhangsan",
        "age":18
    }
    # 第二种 jsonify帮助转为json数据,并设置响应头 Content-Type 为 application/json
    return jsonify(data)

if __name__ == '__main__':
    app.run(debug = True,port=5000)

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

总裁余(余登武)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值