Flask视图的类型注释是什么?

时间:2019-11-14 19:18:37

标签: python flask python-typing

我想将类型注释添加到返回对redirect的调用的视图函数中。 redirect返回什么,如何在我的视图函数中添加对此的注释?

我以为可能是strredirect函数,但不确定。

def setalarm() -> redirect:
    # Retrieves the information to create new alarms.
    return redirect("/")

1 个答案:

答案 0 :(得分:1)

直接的答案是用您写的视图返回的注释来注释您的视图。在您的特定示例中,redirect返回werkzeug.wrappers.Response的实例。

from werkzeug.wrappers import Response

def set_alarm() -> Response:
    return redirect()

与其弄清楚给定的函数返回什么来注释视图,还不如想出一个Union注释来表示允许Flask视图返回的任何内容。但是,Flask不提供键入信息,它的动态特性使表示可能性变得困难。

默认情况下,烧瓶视图可以返回:

  • 一个strbytes
  • werkzeug.wrappers.BaseResponse的子类。
  • 以下形式之一的元组,其中data是Flask视图可以返回的其他任何类型:
    • (data,)
    • (data, status),其中status可以是intstrbytes
    • (data, headers),其中headers是字典,(key, value)元组的迭代对象或werkzeug.datastructures.Headers对象。
    • (data, status, headers)
  • dict转换为JSON。值应为app.json_encoder支持的类型。
  • 可调用的WSGI。

Flask通过覆盖Flask.make_response方法可以支持更多或不同的返回类型。可以通过覆盖Flask.json_encoder扩展它可以序列化为JSON的数据。如果您已自定义Flask的行为,则还需要自定义类型信息。

这里是一个view_return_type,代表了Flask视图中可能的返回类型ignoring JSON typing。定义类型后,您可以使用它注释任何视图。

import typing as t
from werkzeug.datastructures import Headers
from werkzeug.wrappers import BaseResponse

_str_bytes = t.Union[str, bytes]
_data_type = t.Union[
    _str_bytes,
    BaseResponse,
    t.Dict[str, t.Any],
    t.Callable[
        [t.Dict[str, t.Any], t.Callable[[str, t.List[t.Tuple[str, str]]], None]], t.Iterable[bytes]
    ],
]
_status_type = t.Union[int, _str_bytes]
_headers_type = t.Union[
    Headers, t.Dict[_str_bytes, _str_bytes], t.Iterable[t.Tuple[_str_bytes, _str_bytes]],
]

view_return_type = t.Union[
    _data_type,
    t.Tuple[_data_type],
    t.Tuple[_data_type, _status_type],
    t.Tuple[_data_type, _headers_type],
    t.Tuple[_data_type, _status_type, _headers_type],
]
@app.route("/users/<int:id>/")
def user_detail(id: int) -> view_return_type:
    ...