Flask 学习-7. make_response() 自定义响应内容

Posted 上海-悠悠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flask 学习-7. make_response() 自定义响应内容相关的知识,希望对你有一定的参考价值。

前言

视图函数的返回值会自动转换为一个响应对象。如果返回值是一个字典,那么会调用 jsonify() 来产生一个响应。

响应转换规则

视图函数的返回值会自动转换为一个响应对象。如果返回值是一个字符串,那么会被 转换为一个包含作为响应体的字符串、一个 200 OK 出错代码 和一个 text/html 类型的响应对象。
如果返回值是一个字典,那么会调用 jsonify() 来产生一个响应。

具体规则:

  • 如果视图返回的是一个响应对象,那么就直接返回它。
  • 如果返回的是一个字符串,那么根据这个字符串和缺省参数生成一个用于返回的 响应对象。
  • 如果返回的是一个字典,那么调用 jsonify 创建一个响应对象。
  • 如果返回的是一个元组,那么元组中的项目可以提供额外的信息。元组中必须至少 包含一个项目,且项目应当由 (response, status) 、 (response, headers) 或者 (response, status, headers) 组成。 status 的值会重载状态代码, headers 是一个由额外头部值组成的列表 或字典。
  • 如果以上都不是,那么 Flask 会假定返回值是一个有效的 WSGI 应用并把它转换为 一个响应对象。

如果想要在视图内部掌控响应对象的结果,那么可以使用 make_response() 函数。

errorhandler定义404页面

errorhandler的源码内容

    @setupmethod
    def errorhandler(
        self, code_or_exception: t.Union[t.Type[Exception], int]
    ) -> t.Callable[[T_error_handler], T_error_handler]:
        """Register a function to handle errors by code or exception class.

        A decorator that is used to register a function given an
        error code.  Example::

            @app.errorhandler(404)
            def page_not_found(error):
                return 'This page does not exist', 404

        You can also register handlers for arbitrary exceptions::

            @app.errorhandler(DatabaseError)
            def special_exception_handler(error):
                return 'Database connection failed', 500

        .. versionadded:: 0.7
            Use :meth:`register_error_handler` instead of modifying
            :attr:`error_handler_spec` directly, for application wide error
            handlers.

        .. versionadded:: 0.7
           One can now additionally also register custom exception types
           that do not necessarily have to be a subclass of the
           :class:`~werkzeug.exceptions.HTTPException` class.

        :param code_or_exception: the code as integer for the handler, or
                                  an arbitrary exception
        """

设置404返回内容

from flask import Flask
from flask import render_template

app = Flask(__name__)


@app.errorhandler(404)
def not_found(error):
    return render_template('error.html'), 404

error.html内容

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>404</title>
</head>
<body>
  <h2>404 page not found</h2>
</body>
</html>

访问一个不存在的页面,返回404

HTTP/1.1 404 NOT FOUND
Server: Werkzeug/2.2.2 Python/3.8.5
Date: Mon, 22 Aug 2022 02:52:36 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 150
Connection: close

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>404</title>
</head>
<body>
  <h2>404 page not found</h2>
</body>
</html>

make_response() 自定义返回内容

可以使用 make_response() 包裹返回表达式,获得响应对象,并对该对象 进行修改,然后再返回:

from flask import Flask
from flask import render_template, make_response
app = Flask(__name__)


@app.errorhandler(404)
def not_found(error):
    resp = make_response(render_template('error.html'), 404)
    resp.headers['X-Something'] = 'A value'
    return resp

返回404页面返回报文

HTTP/1.1 404 NOT FOUND
Server: Werkzeug/2.2.2 Python/3.8.5
Date: Mon, 22 Aug 2022 02:54:32 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 150
X-Something: A value
Connection: close

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>404</title>
</head>
<body>
  <h2>404 page not found</h2>
</body>
</html>

以上是关于Flask 学习-7. make_response() 自定义响应内容的主要内容,如果未能解决你的问题,请参考以下文章

flask 视图函数的使用

flask restful修改头部信息

测开之路一百二十七:flask之构造response对象

Flask初识

flask 杂记3

Flask 的请求与响应