Перейти к содержанию

Custom Response Classes - File, HTML, Redirect, Streaming, etc.

There are several custom response classes you can use to create an instance and return them directly from your path operations.

Read more about it in the FastAPI docs for Custom Response - HTML, Stream, File, others.

You can import them directly from fastapi.responses:

from fastapi.responses import (
    FileResponse,
    HTMLResponse,
    JSONResponse,
    ORJSONResponse,
    PlainTextResponse,
    RedirectResponse,
    Response,
    StreamingResponse,
    UJSONResponse,
)

FastAPI Responses

There are a couple of custom FastAPI response classes, you can use them to optimize JSON performance.

fastapi.responses.UJSONResponse

UJSONResponse(
    content,
    status_code=200,
    headers=None,
    media_type=None,
    background=None,
)

Bases: JSONResponse

JSON response using the high-performance ujson library to serialize data to JSON.

Read more about it in the FastAPI docs for Custom Response - HTML, Stream, File, others.

PARAMETER DESCRIPTION
content

TYPE: Any

status_code

TYPE: int DEFAULT: 200

headers

TYPE: Optional[Dict[str, str]] DEFAULT: None

media_type

TYPE: Optional[str] DEFAULT: None

background

TYPE: Optional[BackgroundTask] DEFAULT: None

Source code in starlette/responses.py
188
189
190
191
192
193
194
195
196
def __init__(
    self,
    content: typing.Any,
    status_code: int = 200,
    headers: typing.Optional[typing.Dict[str, str]] = None,
    media_type: typing.Optional[str] = None,
    background: typing.Optional[BackgroundTask] = None,
) -> None:
    super().__init__(content, status_code, headers, media_type, background)

charset class-attribute instance-attribute

charset = 'utf-8'

status_code instance-attribute

status_code = status_code

media_type class-attribute instance-attribute

media_type = 'application/json'

body instance-attribute

body = render(content)

background instance-attribute

background = background

headers property

headers

render

render(content)
PARAMETER DESCRIPTION
content

TYPE: Any

Source code in fastapi/responses.py
31
32
33
def render(self, content: Any) -> bytes:
    assert ujson is not None, "ujson must be installed to use UJSONResponse"
    return ujson.dumps(content, ensure_ascii=False).encode("utf-8")

init_headers

init_headers(headers=None)
PARAMETER DESCRIPTION
headers

TYPE: Optional[Mapping[str, str]] DEFAULT: None

Source code in starlette/responses.py
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
def init_headers(
    self, headers: typing.Optional[typing.Mapping[str, str]] = None
) -> None:
    if headers is None:
        raw_headers: typing.List[typing.Tuple[bytes, bytes]] = []
        populate_content_length = True
        populate_content_type = True
    else:
        raw_headers = [
            (k.lower().encode("latin-1"), v.encode("latin-1"))
            for k, v in headers.items()
        ]
        keys = [h[0] for h in raw_headers]
        populate_content_length = b"content-length" not in keys
        populate_content_type = b"content-type" not in keys

    body = getattr(self, "body", None)
    if (
        body is not None
        and populate_content_length
        and not (self.status_code < 200 or self.status_code in (204, 304))
    ):
        content_length = str(len(body))
        raw_headers.append((b"content-length", content_length.encode("latin-1")))

    content_type = self.media_type
    if content_type is not None and populate_content_type:
        if content_type.startswith("text/"):
            content_type += "; charset=" + self.charset
        raw_headers.append((b"content-type", content_type.encode("latin-1")))

    self.raw_headers = raw_headers
set_cookie(
    key,
    value="",
    max_age=None,
    expires=None,
    path="/",
    domain=None,
    secure=False,
    httponly=False,
    samesite="lax",
)
PARAMETER DESCRIPTION
key

TYPE: str

value

TYPE: str DEFAULT: ''

max_age

TYPE: Optional[int] DEFAULT: None

expires

TYPE: Optional[Union[datetime, str, int]] DEFAULT: None

path

TYPE: str DEFAULT: '/'

domain

TYPE: Optional[str] DEFAULT: None

secure

TYPE: bool DEFAULT: False

httponly

TYPE: bool DEFAULT: False

samesite

TYPE: Optional[Literal['lax', 'strict', 'none']] DEFAULT: 'lax'

Source code in starlette/responses.py
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
def set_cookie(
    self,
    key: str,
    value: str = "",
    max_age: typing.Optional[int] = None,
    expires: typing.Optional[typing.Union[datetime, str, int]] = None,
    path: str = "/",
    domain: typing.Optional[str] = None,
    secure: bool = False,
    httponly: bool = False,
    samesite: typing.Optional[Literal["lax", "strict", "none"]] = "lax",
) -> None:
    cookie: "http.cookies.BaseCookie[str]" = http.cookies.SimpleCookie()
    cookie[key] = value
    if max_age is not None:
        cookie[key]["max-age"] = max_age
    if expires is not None:
        if isinstance(expires, datetime):
            cookie[key]["expires"] = format_datetime(expires, usegmt=True)
        else:
            cookie[key]["expires"] = expires
    if path is not None:
        cookie[key]["path"] = path
    if domain is not None:
        cookie[key]["domain"] = domain
    if secure:
        cookie[key]["secure"] = True
    if httponly:
        cookie[key]["httponly"] = True
    if samesite is not None:
        assert samesite.lower() in [
            "strict",
            "lax",
            "none",
        ], "samesite must be either 'strict', 'lax' or 'none'"
        cookie[key]["samesite"] = samesite
    cookie_val = cookie.output(header="").strip()
    self.raw_headers.append((b"set-cookie", cookie_val.encode("latin-1")))
delete_cookie(
    key,
    path="/",
    domain=None,
    secure=False,
    httponly=False,
    samesite="lax",
)
PARAMETER DESCRIPTION
key

TYPE: str

path

TYPE: str DEFAULT: '/'

domain

TYPE: Optional[str] DEFAULT: None

secure

TYPE: bool DEFAULT: False

httponly

TYPE: bool DEFAULT: False

samesite

TYPE: Optional[Literal['lax', 'strict', 'none']] DEFAULT: 'lax'

Source code in starlette/responses.py
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
def delete_cookie(
    self,
    key: str,
    path: str = "/",
    domain: typing.Optional[str] = None,
    secure: bool = False,
    httponly: bool = False,
    samesite: typing.Optional[Literal["lax", "strict", "none"]] = "lax",
) -> None:
    self.set_cookie(
        key,
        max_age=0,
        expires=0,
        path=path,
        domain=domain,
        secure=secure,
        httponly=httponly,
        samesite=samesite,
    )

fastapi.responses.ORJSONResponse

ORJSONResponse(
    content,
    status_code=200,
    headers=None,
    media_type=None,
    background=None,
)

Bases: JSONResponse

JSON response using the high-performance orjson library to serialize data to JSON.

Read more about it in the FastAPI docs for Custom Response - HTML, Stream, File, others.

PARAMETER DESCRIPTION
content

TYPE: Any

status_code

TYPE: int DEFAULT: 200

headers

TYPE: Optional[Dict[str, str]] DEFAULT: None

media_type

TYPE: Optional[str] DEFAULT: None

background

TYPE: Optional[BackgroundTask] DEFAULT: None

Source code in starlette/responses.py
188
189
190
191
192
193
194
195
196
def __init__(
    self,
    content: typing.Any,
    status_code: int = 200,
    headers: typing.Optional[typing.Dict[str, str]] = None,
    media_type: typing.Optional[str] = None,
    background: typing.Optional[BackgroundTask] = None,
) -> None:
    super().__init__(content, status_code, headers, media_type, background)

charset class-attribute instance-attribute

charset = 'utf-8'

status_code instance-attribute

status_code = status_code

media_type class-attribute instance-attribute

media_type = 'application/json'

body instance-attribute

body = render(content)

background instance-attribute

background = background

headers property

headers

render

render(content)
PARAMETER DESCRIPTION
content

TYPE: Any

Source code in fastapi/responses.py
44
45
46
47
48
def render(self, content: Any) -> bytes:
    assert orjson is not None, "orjson must be installed to use ORJSONResponse"
    return orjson.dumps(
        content, option=orjson.OPT_NON_STR_KEYS | orjson.OPT_SERIALIZE_NUMPY
    )

init_headers

init_headers(headers=None)
PARAMETER DESCRIPTION
headers

TYPE: Optional[Mapping[str, str]] DEFAULT: None

Source code in starlette/responses.py
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
def init_headers(
    self, headers: typing.Optional[typing.Mapping[str, str]] = None
) -> None:
    if headers is None:
        raw_headers: typing.List[typing.Tuple[bytes, bytes]] = []
        populate_content_length = True
        populate_content_type = True
    else:
        raw_headers = [
            (k.lower().encode("latin-1"), v.encode("latin-1"))
            for k, v in headers.items()
        ]
        keys = [h[0] for h in raw_headers]
        populate_content_length = b"content-length" not in keys
        populate_content_type = b"content-type" not in keys

    body = getattr(self, "body", None)
    if (
        body is not None
        and populate_content_length
        and not (self.status_code < 200 or self.status_code in (204, 304))
    ):
        content_length = str(len(body))
        raw_headers.append((b"content-length", content_length.encode("latin-1")))

    content_type = self.media_type
    if content_type is not None and populate_content_type:
        if content_type.startswith("text/"):
            content_type += "; charset=" + self.charset
        raw_headers.append((b"content-type", content_type.encode("latin-1")))

    self.raw_headers = raw_headers
set_cookie(
    key,
    value="",
    max_age=None,
    expires=None,
    path="/",
    domain=None,
    secure=False,
    httponly=False,
    samesite="lax",
)
PARAMETER DESCRIPTION
key

TYPE: str

value

TYPE: str DEFAULT: ''

max_age

TYPE: Optional[int] DEFAULT: None

expires

TYPE: Optional[Union[datetime, str, int]] DEFAULT: None

path

TYPE: str DEFAULT: '/'

domain

TYPE: Optional[str] DEFAULT: None

secure

TYPE: bool DEFAULT: False

httponly

TYPE: bool DEFAULT: False

samesite

TYPE: Optional[Literal['lax', 'strict', 'none']] DEFAULT: 'lax'

Source code in starlette/responses.py
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
def set_cookie(
    self,
    key: str,
    value: str = "",
    max_age: typing.Optional[int] = None,
    expires: typing.Optional[typing.Union[datetime, str, int]] = None,
    path: str = "/",
    domain: typing.Optional[str] = None,
    secure: bool = False,
    httponly: bool = False,
    samesite: typing.Optional[Literal["lax", "strict", "none"]] = "lax",
) -> None:
    cookie: "http.cookies.BaseCookie[str]" = http.cookies.SimpleCookie()
    cookie[key] = value
    if max_age is not None:
        cookie[key]["max-age"] = max_age
    if expires is not None:
        if isinstance(expires, datetime):
            cookie[key]["expires"] = format_datetime(expires, usegmt=True)
        else:
            cookie[key]["expires"] = expires
    if path is not None:
        cookie[key]["path"] = path
    if domain is not None:
        cookie[key]["domain"] = domain
    if secure:
        cookie[key]["secure"] = True
    if httponly:
        cookie[key]["httponly"] = True
    if samesite is not None:
        assert samesite.lower() in [
            "strict",
            "lax",
            "none",
        ], "samesite must be either 'strict', 'lax' or 'none'"
        cookie[key]["samesite"] = samesite
    cookie_val = cookie.output(header="").strip()
    self.raw_headers.append((b"set-cookie", cookie_val.encode("latin-1")))
delete_cookie(
    key,
    path="/",
    domain=None,
    secure=False,
    httponly=False,
    samesite="lax",
)
PARAMETER DESCRIPTION
key

TYPE: str

path

TYPE: str DEFAULT: '/'

domain

TYPE: Optional[str] DEFAULT: None

secure

TYPE: bool DEFAULT: False

httponly

TYPE: bool DEFAULT: False

samesite

TYPE: Optional[Literal['lax', 'strict', 'none']] DEFAULT: 'lax'

Source code in starlette/responses.py
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
def delete_cookie(
    self,
    key: str,
    path: str = "/",
    domain: typing.Optional[str] = None,
    secure: bool = False,
    httponly: bool = False,
    samesite: typing.Optional[Literal["lax", "strict", "none"]] = "lax",
) -> None:
    self.set_cookie(
        key,
        max_age=0,
        expires=0,
        path=path,
        domain=domain,
        secure=secure,
        httponly=httponly,
        samesite=samesite,
    )

Starlette Responses

fastapi.responses.FileResponse

FileResponse(
    path,
    status_code=200,
    headers=None,
    media_type=None,
    background=None,
    filename=None,
    stat_result=None,
    method=None,
    content_disposition_type="attachment",
)

Bases: Response

PARAMETER DESCRIPTION
path

TYPE: Union[str, PathLike[str]]

status_code

TYPE: int DEFAULT: 200

headers

TYPE: Optional[Mapping[str, str]] DEFAULT: None

media_type

TYPE: Optional[str] DEFAULT: None

background

TYPE: Optional[BackgroundTask] DEFAULT: None

filename

TYPE: Optional[str] DEFAULT: None

stat_result

TYPE: Optional[stat_result] DEFAULT: None

method

TYPE: Optional[str] DEFAULT: None

content_disposition_type

TYPE: str DEFAULT: 'attachment'

Source code in starlette/responses.py
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
def __init__(
    self,
    path: typing.Union[str, "os.PathLike[str]"],
    status_code: int = 200,
    headers: typing.Optional[typing.Mapping[str, str]] = None,
    media_type: typing.Optional[str] = None,
    background: typing.Optional[BackgroundTask] = None,
    filename: typing.Optional[str] = None,
    stat_result: typing.Optional[os.stat_result] = None,
    method: typing.Optional[str] = None,
    content_disposition_type: str = "attachment",
) -> None:
    self.path = path
    self.status_code = status_code
    self.filename = filename
    self.send_header_only = method is not None and method.upper() == "HEAD"
    if media_type is None:
        media_type = guess_type(filename or path)[0] or "text/plain"
    self.media_type = media_type
    self.background = background
    self.init_headers(headers)
    if self.filename is not None:
        content_disposition_filename = quote(self.filename)
        if content_disposition_filename != self.filename:
            content_disposition = "{}; filename*=utf-8''{}".format(
                content_disposition_type, content_disposition_filename
            )
        else:
            content_disposition = '{}; filename="{}"'.format(
                content_disposition_type, self.filename
            )
        self.headers.setdefault("content-disposition", content_disposition)
    self.stat_result = stat_result
    if stat_result is not None:
        self.set_stat_headers(stat_result)

chunk_size class-attribute instance-attribute

chunk_size = 64 * 1024

charset class-attribute instance-attribute

charset = 'utf-8'

status_code instance-attribute

status_code = status_code

media_type instance-attribute

media_type = media_type

body instance-attribute

body = render(content)

background instance-attribute

background = background

headers property

headers

render

render(content)
PARAMETER DESCRIPTION
content

TYPE: Any

Source code in starlette/responses.py
58
59
60
61
62
63
def render(self, content: typing.Any) -> bytes:
    if content is None:
        return b""
    if isinstance(content, bytes):
        return content
    return content.encode(self.charset)

init_headers

init_headers(headers=None)
PARAMETER DESCRIPTION
headers

TYPE: Optional[Mapping[str, str]] DEFAULT: None

Source code in starlette/responses.py
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
def init_headers(
    self, headers: typing.Optional[typing.Mapping[str, str]] = None
) -> None:
    if headers is None:
        raw_headers: typing.List[typing.Tuple[bytes, bytes]] = []
        populate_content_length = True
        populate_content_type = True
    else:
        raw_headers = [
            (k.lower().encode("latin-1"), v.encode("latin-1"))
            for k, v in headers.items()
        ]
        keys = [h[0] for h in raw_headers]
        populate_content_length = b"content-length" not in keys
        populate_content_type = b"content-type" not in keys

    body = getattr(self, "body", None)
    if (
        body is not None
        and populate_content_length
        and not (self.status_code < 200 or self.status_code in (204, 304))
    ):
        content_length = str(len(body))
        raw_headers.append((b"content-length", content_length.encode("latin-1")))

    content_type = self.media_type
    if content_type is not None and populate_content_type:
        if content_type.startswith("text/"):
            content_type += "; charset=" + self.charset
        raw_headers.append((b"content-type", content_type.encode("latin-1")))

    self.raw_headers = raw_headers
set_cookie(
    key,
    value="",
    max_age=None,
    expires=None,
    path="/",
    domain=None,
    secure=False,
    httponly=False,
    samesite="lax",
)
PARAMETER DESCRIPTION
key

TYPE: str

value

TYPE: str DEFAULT: ''

max_age

TYPE: Optional[int] DEFAULT: None

expires

TYPE: Optional[Union[datetime, str, int]] DEFAULT: None

path

TYPE: str DEFAULT: '/'

domain

TYPE: Optional[str] DEFAULT: None

secure

TYPE: bool DEFAULT: False

httponly

TYPE: bool DEFAULT: False

samesite

TYPE: Optional[Literal['lax', 'strict', 'none']] DEFAULT: 'lax'

Source code in starlette/responses.py
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
def set_cookie(
    self,
    key: str,
    value: str = "",
    max_age: typing.Optional[int] = None,
    expires: typing.Optional[typing.Union[datetime, str, int]] = None,
    path: str = "/",
    domain: typing.Optional[str] = None,
    secure: bool = False,
    httponly: bool = False,
    samesite: typing.Optional[Literal["lax", "strict", "none"]] = "lax",
) -> None:
    cookie: "http.cookies.BaseCookie[str]" = http.cookies.SimpleCookie()
    cookie[key] = value
    if max_age is not None:
        cookie[key]["max-age"] = max_age
    if expires is not None:
        if isinstance(expires, datetime):
            cookie[key]["expires"] = format_datetime(expires, usegmt=True)
        else:
            cookie[key]["expires"] = expires
    if path is not None:
        cookie[key]["path"] = path
    if domain is not None:
        cookie[key]["domain"] = domain
    if secure:
        cookie[key]["secure"] = True
    if httponly:
        cookie[key]["httponly"] = True
    if samesite is not None:
        assert samesite.lower() in [
            "strict",
            "lax",
            "none",
        ], "samesite must be either 'strict', 'lax' or 'none'"
        cookie[key]["samesite"] = samesite
    cookie_val = cookie.output(header="").strip()
    self.raw_headers.append((b"set-cookie", cookie_val.encode("latin-1")))
delete_cookie(
    key,
    path="/",
    domain=None,
    secure=False,
    httponly=False,
    samesite="lax",
)
PARAMETER DESCRIPTION
key

TYPE: str

path

TYPE: str DEFAULT: '/'

domain

TYPE: Optional[str] DEFAULT: None

secure

TYPE: bool DEFAULT: False

httponly

TYPE: bool DEFAULT: False

samesite

TYPE: Optional[Literal['lax', 'strict', 'none']] DEFAULT: 'lax'

Source code in starlette/responses.py
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
def delete_cookie(
    self,
    key: str,
    path: str = "/",
    domain: typing.Optional[str] = None,
    secure: bool = False,
    httponly: bool = False,
    samesite: typing.Optional[Literal["lax", "strict", "none"]] = "lax",
) -> None:
    self.set_cookie(
        key,
        max_age=0,
        expires=0,
        path=path,
        domain=domain,
        secure=secure,
        httponly=httponly,
        samesite=samesite,
    )

fastapi.responses.HTMLResponse

HTMLResponse(
    content=None,
    status_code=200,
    headers=None,
    media_type=None,
    background=None,
)

Bases: Response

PARAMETER DESCRIPTION
content

TYPE: Any DEFAULT: None

status_code

TYPE: int DEFAULT: 200

headers

TYPE: Optional[Mapping[str, str]] DEFAULT: None

media_type

TYPE: Optional[str] DEFAULT: None

background

TYPE: Optional[BackgroundTask] DEFAULT: None

Source code in starlette/responses.py
43
44
45
46
47
48
49
50
51
52
53
54
55
56
def __init__(
    self,
    content: typing.Any = None,
    status_code: int = 200,
    headers: typing.Optional[typing.Mapping[str, str]] = None,
    media_type: typing.Optional[str] = None,
    background: typing.Optional[BackgroundTask] = None,
) -> None:
    self.status_code = status_code
    if media_type is not None:
        self.media_type = media_type
    self.background = background
    self.body = self.render(content)
    self.init_headers(headers)

charset class-attribute instance-attribute

charset = 'utf-8'

status_code instance-attribute

status_code = status_code

media_type class-attribute instance-attribute

media_type = 'text/html'

body instance-attribute

body = render(content)

background instance-attribute

background = background

headers property

headers

render

render(content)
PARAMETER DESCRIPTION
content

TYPE: Any

Source code in starlette/responses.py
58
59
60
61
62
63
def render(self, content: typing.Any) -> bytes:
    if content is None:
        return b""
    if isinstance(content, bytes):
        return content
    return content.encode(self.charset)

init_headers

init_headers(headers=None)
PARAMETER DESCRIPTION
headers

TYPE: Optional[Mapping[str, str]] DEFAULT: None

Source code in starlette/responses.py
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
def init_headers(
    self, headers: typing.Optional[typing.Mapping[str, str]] = None
) -> None:
    if headers is None:
        raw_headers: typing.List[typing.Tuple[bytes, bytes]] = []
        populate_content_length = True
        populate_content_type = True
    else:
        raw_headers = [
            (k.lower().encode("latin-1"), v.encode("latin-1"))
            for k, v in headers.items()
        ]
        keys = [h[0] for h in raw_headers]
        populate_content_length = b"content-length" not in keys
        populate_content_type = b"content-type" not in keys

    body = getattr(self, "body", None)
    if (
        body is not None
        and populate_content_length
        and not (self.status_code < 200 or self.status_code in (204, 304))
    ):
        content_length = str(len(body))
        raw_headers.append((b"content-length", content_length.encode("latin-1")))

    content_type = self.media_type
    if content_type is not None and populate_content_type:
        if content_type.startswith("text/"):
            content_type += "; charset=" + self.charset
        raw_headers.append((b"content-type", content_type.encode("latin-1")))

    self.raw_headers = raw_headers
set_cookie(
    key,
    value="",
    max_age=None,
    expires=None,
    path="/",
    domain=None,
    secure=False,
    httponly=False,
    samesite="lax",
)
PARAMETER DESCRIPTION
key

TYPE: str

value

TYPE: str DEFAULT: ''

max_age

TYPE: Optional[int] DEFAULT: None

expires

TYPE: Optional[Union[datetime, str, int]] DEFAULT: None

path

TYPE: str DEFAULT: '/'

domain

TYPE: Optional[str] DEFAULT: None

secure

TYPE: bool DEFAULT: False

httponly

TYPE: bool DEFAULT: False

samesite

TYPE: Optional[Literal['lax', 'strict', 'none']] DEFAULT: 'lax'

Source code in starlette/responses.py
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
def set_cookie(
    self,
    key: str,
    value: str = "",
    max_age: typing.Optional[int] = None,
    expires: typing.Optional[typing.Union[datetime, str, int]] = None,
    path: str = "/",
    domain: typing.Optional[str] = None,
    secure: bool = False,
    httponly: bool = False,
    samesite: typing.Optional[Literal["lax", "strict", "none"]] = "lax",
) -> None:
    cookie: "http.cookies.BaseCookie[str]" = http.cookies.SimpleCookie()
    cookie[key] = value
    if max_age is not None:
        cookie[key]["max-age"] = max_age
    if expires is not None:
        if isinstance(expires, datetime):
            cookie[key]["expires"] = format_datetime(expires, usegmt=True)
        else:
            cookie[key]["expires"] = expires
    if path is not None:
        cookie[key]["path"] = path
    if domain is not None:
        cookie[key]["domain"] = domain
    if secure:
        cookie[key]["secure"] = True
    if httponly:
        cookie[key]["httponly"] = True
    if samesite is not None:
        assert samesite.lower() in [
            "strict",
            "lax",
            "none",
        ], "samesite must be either 'strict', 'lax' or 'none'"
        cookie[key]["samesite"] = samesite
    cookie_val = cookie.output(header="").strip()
    self.raw_headers.append((b"set-cookie", cookie_val.encode("latin-1")))
delete_cookie(
    key,
    path="/",
    domain=None,
    secure=False,
    httponly=False,
    samesite="lax",
)
PARAMETER DESCRIPTION
key

TYPE: str

path

TYPE: str DEFAULT: '/'

domain

TYPE: Optional[str] DEFAULT: None

secure

TYPE: bool DEFAULT: False

httponly

TYPE: bool DEFAULT: False

samesite

TYPE: Optional[Literal['lax', 'strict', 'none']] DEFAULT: 'lax'

Source code in starlette/responses.py
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
def delete_cookie(
    self,
    key: str,
    path: str = "/",
    domain: typing.Optional[str] = None,
    secure: bool = False,
    httponly: bool = False,
    samesite: typing.Optional[Literal["lax", "strict", "none"]] = "lax",
) -> None:
    self.set_cookie(
        key,
        max_age=0,
        expires=0,
        path=path,
        domain=domain,
        secure=secure,
        httponly=httponly,
        samesite=samesite,
    )

fastapi.responses.JSONResponse

JSONResponse(
    content,
    status_code=200,
    headers=None,
    media_type=None,
    background=None,
)

Bases: Response

PARAMETER DESCRIPTION
content

TYPE: Any

status_code

TYPE: int DEFAULT: 200

headers

TYPE: Optional[Dict[str, str]] DEFAULT: None

media_type

TYPE: Optional[str] DEFAULT: None

background

TYPE: Optional[BackgroundTask] DEFAULT: None

Source code in starlette/responses.py
188
189
190
191
192
193
194
195
196
def __init__(
    self,
    content: typing.Any,
    status_code: int = 200,
    headers: typing.Optional[typing.Dict[str, str]] = None,
    media_type: typing.Optional[str] = None,
    background: typing.Optional[BackgroundTask] = None,
) -> None:
    super().__init__(content, status_code, headers, media_type, background)

charset class-attribute instance-attribute

charset = 'utf-8'

status_code instance-attribute

status_code = status_code

media_type class-attribute instance-attribute

media_type = 'application/json'

body instance-attribute

body = render(content)

background instance-attribute

background = background

headers property

headers

render

render(content)
PARAMETER DESCRIPTION
content

TYPE: Any

Source code in starlette/responses.py
198
199
200
201
202
203
204
205
def render(self, content: typing.Any) -> bytes:
    return json.dumps(
        content,
        ensure_ascii=False,
        allow_nan=False,
        indent=None,
        separators=(",", ":"),
    ).encode("utf-8")

init_headers

init_headers(headers=None)
PARAMETER DESCRIPTION
headers

TYPE: Optional[Mapping[str, str]] DEFAULT: None

Source code in starlette/responses.py
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
def init_headers(
    self, headers: typing.Optional[typing.Mapping[str, str]] = None
) -> None:
    if headers is None:
        raw_headers: typing.List[typing.Tuple[bytes, bytes]] = []
        populate_content_length = True
        populate_content_type = True
    else:
        raw_headers = [
            (k.lower().encode("latin-1"), v.encode("latin-1"))
            for k, v in headers.items()
        ]
        keys = [h[0] for h in raw_headers]
        populate_content_length = b"content-length" not in keys
        populate_content_type = b"content-type" not in keys

    body = getattr(self, "body", None)
    if (
        body is not None
        and populate_content_length
        and not (self.status_code < 200 or self.status_code in (204, 304))
    ):
        content_length = str(len(body))
        raw_headers.append((b"content-length", content_length.encode("latin-1")))

    content_type = self.media_type
    if content_type is not None and populate_content_type:
        if content_type.startswith("text/"):
            content_type += "; charset=" + self.charset
        raw_headers.append((b"content-type", content_type.encode("latin-1")))

    self.raw_headers = raw_headers
set_cookie(
    key,
    value="",
    max_age=None,
    expires=None,
    path="/",
    domain=None,
    secure=False,
    httponly=False,
    samesite="lax",
)
PARAMETER DESCRIPTION
key

TYPE: str

value

TYPE: str DEFAULT: ''

max_age

TYPE: Optional[int] DEFAULT: None

expires

TYPE: Optional[Union[datetime, str, int]] DEFAULT: None

path

TYPE: str DEFAULT: '/'

domain

TYPE: Optional[str] DEFAULT: None

secure

TYPE: bool DEFAULT: False

httponly

TYPE: bool DEFAULT: False

samesite

TYPE: Optional[Literal['lax', 'strict', 'none']] DEFAULT: 'lax'

Source code in starlette/responses.py
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
def set_cookie(
    self,
    key: str,
    value: str = "",
    max_age: typing.Optional[int] = None,
    expires: typing.Optional[typing.Union[datetime, str, int]] = None,
    path: str = "/",
    domain: typing.Optional[str] = None,
    secure: bool = False,
    httponly: bool = False,
    samesite: typing.Optional[Literal["lax", "strict", "none"]] = "lax",
) -> None:
    cookie: "http.cookies.BaseCookie[str]" = http.cookies.SimpleCookie()
    cookie[key] = value
    if max_age is not None:
        cookie[key]["max-age"] = max_age
    if expires is not None:
        if isinstance(expires, datetime):
            cookie[key]["expires"] = format_datetime(expires, usegmt=True)
        else:
            cookie[key]["expires"] = expires
    if path is not None:
        cookie[key]["path"] = path
    if domain is not None:
        cookie[key]["domain"] = domain
    if secure:
        cookie[key]["secure"] = True
    if httponly:
        cookie[key]["httponly"] = True
    if samesite is not None:
        assert samesite.lower() in [
            "strict",
            "lax",
            "none",
        ], "samesite must be either 'strict', 'lax' or 'none'"
        cookie[key]["samesite"] = samesite
    cookie_val = cookie.output(header="").strip()
    self.raw_headers.append((b"set-cookie", cookie_val.encode("latin-1")))
delete_cookie(
    key,
    path="/",
    domain=None,
    secure=False,
    httponly=False,
    samesite="lax",
)
PARAMETER DESCRIPTION
key

TYPE: str

path

TYPE: str DEFAULT: '/'

domain

TYPE: Optional[str] DEFAULT: None

secure

TYPE: bool DEFAULT: False

httponly

TYPE: bool DEFAULT: False

samesite

TYPE: Optional[Literal['lax', 'strict', 'none']] DEFAULT: 'lax'

Source code in starlette/responses.py
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
def delete_cookie(
    self,
    key: str,
    path: str = "/",
    domain: typing.Optional[str] = None,
    secure: bool = False,
    httponly: bool = False,
    samesite: typing.Optional[Literal["lax", "strict", "none"]] = "lax",
) -> None:
    self.set_cookie(
        key,
        max_age=0,
        expires=0,
        path=path,
        domain=domain,
        secure=secure,
        httponly=httponly,
        samesite=samesite,
    )

fastapi.responses.PlainTextResponse

PlainTextResponse(
    content=None,
    status_code=200,
    headers=None,
    media_type=None,
    background=None,
)

Bases: Response

PARAMETER DESCRIPTION
content

TYPE: Any DEFAULT: None

status_code

TYPE: int DEFAULT: 200

headers

TYPE: Optional[Mapping[str, str]] DEFAULT: None

media_type

TYPE: Optional[str] DEFAULT: None

background

TYPE: Optional[BackgroundTask] DEFAULT: None

Source code in starlette/responses.py
43
44
45
46
47
48
49
50
51
52
53
54
55
56
def __init__(
    self,
    content: typing.Any = None,
    status_code: int = 200,
    headers: typing.Optional[typing.Mapping[str, str]] = None,
    media_type: typing.Optional[str] = None,
    background: typing.Optional[BackgroundTask] = None,
) -> None:
    self.status_code = status_code
    if media_type is not None:
        self.media_type = media_type
    self.background = background
    self.body = self.render(content)
    self.init_headers(headers)

charset class-attribute instance-attribute

charset = 'utf-8'

status_code instance-attribute

status_code = status_code

media_type class-attribute instance-attribute

media_type = 'text/plain'

body instance-attribute

body = render(content)

background instance-attribute

background = background

headers property

headers

render

render(content)
PARAMETER DESCRIPTION
content

TYPE: Any

Source code in starlette/responses.py
58
59
60
61
62
63
def render(self, content: typing.Any) -> bytes:
    if content is None:
        return b""
    if isinstance(content, bytes):
        return content
    return content.encode(self.charset)

init_headers

init_headers(headers=None)
PARAMETER DESCRIPTION
headers

TYPE: Optional[Mapping[str, str]] DEFAULT: None

Source code in starlette/responses.py
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
def init_headers(
    self, headers: typing.Optional[typing.Mapping[str, str]] = None
) -> None:
    if headers is None:
        raw_headers: typing.List[typing.Tuple[bytes, bytes]] = []
        populate_content_length = True
        populate_content_type = True
    else:
        raw_headers = [
            (k.lower().encode("latin-1"), v.encode("latin-1"))
            for k, v in headers.items()
        ]
        keys = [h[0] for h in raw_headers]
        populate_content_length = b"content-length" not in keys
        populate_content_type = b"content-type" not in keys

    body = getattr(self, "body", None)
    if (
        body is not None
        and populate_content_length
        and not (self.status_code < 200 or self.status_code in (204, 304))
    ):
        content_length = str(len(body))
        raw_headers.append((b"content-length", content_length.encode("latin-1")))

    content_type = self.media_type
    if content_type is not None and populate_content_type:
        if content_type.startswith("text/"):
            content_type += "; charset=" + self.charset
        raw_headers.append((b"content-type", content_type.encode("latin-1")))

    self.raw_headers = raw_headers
set_cookie(
    key,
    value="",
    max_age=None,
    expires=None,
    path="/",
    domain=None,
    secure=False,
    httponly=False,
    samesite="lax",
)
PARAMETER DESCRIPTION
key

TYPE: str

value

TYPE: str DEFAULT: ''

max_age

TYPE: Optional[int] DEFAULT: None

expires

TYPE: Optional[Union[datetime, str, int]] DEFAULT: None

path

TYPE: str DEFAULT: '/'

domain

TYPE: Optional[str] DEFAULT: None

secure

TYPE: bool DEFAULT: False

httponly

TYPE: bool DEFAULT: False

samesite

TYPE: Optional[Literal['lax', 'strict', 'none']] DEFAULT: 'lax'

Source code in starlette/responses.py
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
def set_cookie(
    self,
    key: str,
    value: str = "",
    max_age: typing.Optional[int] = None,
    expires: typing.Optional[typing.Union[datetime, str, int]] = None,
    path: str = "/",
    domain: typing.Optional[str] = None,
    secure: bool = False,
    httponly: bool = False,
    samesite: typing.Optional[Literal["lax", "strict", "none"]] = "lax",
) -> None:
    cookie: "http.cookies.BaseCookie[str]" = http.cookies.SimpleCookie()
    cookie[key] = value
    if max_age is not None:
        cookie[key]["max-age"] = max_age
    if expires is not None:
        if isinstance(expires, datetime):
            cookie[key]["expires"] = format_datetime(expires, usegmt=True)
        else:
            cookie[key]["expires"] = expires
    if path is not None:
        cookie[key]["path"] = path
    if domain is not None:
        cookie[key]["domain"] = domain
    if secure:
        cookie[key]["secure"] = True
    if httponly:
        cookie[key]["httponly"] = True
    if samesite is not None:
        assert samesite.lower() in [
            "strict",
            "lax",
            "none",
        ], "samesite must be either 'strict', 'lax' or 'none'"
        cookie[key]["samesite"] = samesite
    cookie_val = cookie.output(header="").strip()
    self.raw_headers.append((b"set-cookie", cookie_val.encode("latin-1")))
delete_cookie(
    key,
    path="/",
    domain=None,
    secure=False,
    httponly=False,
    samesite="lax",
)
PARAMETER DESCRIPTION
key

TYPE: str

path

TYPE: str DEFAULT: '/'

domain

TYPE: Optional[str] DEFAULT: None

secure

TYPE: bool DEFAULT: False

httponly

TYPE: bool DEFAULT: False

samesite

TYPE: Optional[Literal['lax', 'strict', 'none']] DEFAULT: 'lax'

Source code in starlette/responses.py
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
def delete_cookie(
    self,
    key: str,
    path: str = "/",
    domain: typing.Optional[str] = None,
    secure: bool = False,
    httponly: bool = False,
    samesite: typing.Optional[Literal["lax", "strict", "none"]] = "lax",
) -> None:
    self.set_cookie(
        key,
        max_age=0,
        expires=0,
        path=path,
        domain=domain,
        secure=secure,
        httponly=httponly,
        samesite=samesite,
    )

fastapi.responses.RedirectResponse

RedirectResponse(
    url, status_code=307, headers=None, background=None
)

Bases: Response

PARAMETER DESCRIPTION
url

TYPE: Union[str, URL]

status_code

TYPE: int DEFAULT: 307

headers

TYPE: Optional[Mapping[str, str]] DEFAULT: None

background

TYPE: Optional[BackgroundTask] DEFAULT: None

Source code in starlette/responses.py
209
210
211
212
213
214
215
216
217
218
219
def __init__(
    self,
    url: typing.Union[str, URL],
    status_code: int = 307,
    headers: typing.Optional[typing.Mapping[str, str]] = None,
    background: typing.Optional[BackgroundTask] = None,
) -> None:
    super().__init__(
        content=b"", status_code=status_code, headers=headers, background=background
    )
    self.headers["location"] = quote(str(url), safe=":/%#?=@[]!$&'()*+,;")

charset class-attribute instance-attribute

charset = 'utf-8'

status_code instance-attribute

status_code = status_code

media_type class-attribute instance-attribute

media_type = None

body instance-attribute

body = render(content)

background instance-attribute

background = background

headers property

headers

render

render(content)
PARAMETER DESCRIPTION
content

TYPE: Any

Source code in starlette/responses.py
58
59
60
61
62
63
def render(self, content: typing.Any) -> bytes:
    if content is None:
        return b""
    if isinstance(content, bytes):
        return content
    return content.encode(self.charset)

init_headers

init_headers(headers=None)
PARAMETER DESCRIPTION
headers

TYPE: Optional[Mapping[str, str]] DEFAULT: None

Source code in starlette/responses.py
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
def init_headers(
    self, headers: typing.Optional[typing.Mapping[str, str]] = None
) -> None:
    if headers is None:
        raw_headers: typing.List[typing.Tuple[bytes, bytes]] = []
        populate_content_length = True
        populate_content_type = True
    else:
        raw_headers = [
            (k.lower().encode("latin-1"), v.encode("latin-1"))
            for k, v in headers.items()
        ]
        keys = [h[0] for h in raw_headers]
        populate_content_length = b"content-length" not in keys
        populate_content_type = b"content-type" not in keys

    body = getattr(self, "body", None)
    if (
        body is not None
        and populate_content_length
        and not (self.status_code < 200 or self.status_code in (204, 304))
    ):
        content_length = str(len(body))
        raw_headers.append((b"content-length", content_length.encode("latin-1")))

    content_type = self.media_type
    if content_type is not None and populate_content_type:
        if content_type.startswith("text/"):
            content_type += "; charset=" + self.charset
        raw_headers.append((b"content-type", content_type.encode("latin-1")))

    self.raw_headers = raw_headers
set_cookie(
    key,
    value="",
    max_age=None,
    expires=None,
    path="/",
    domain=None,
    secure=False,
    httponly=False,
    samesite="lax",
)
PARAMETER DESCRIPTION
key

TYPE: str

value

TYPE: str DEFAULT: ''

max_age

TYPE: Optional[int] DEFAULT: None

expires

TYPE: Optional[Union[datetime, str, int]] DEFAULT: None

path

TYPE: str DEFAULT: '/'

domain

TYPE: Optional[str] DEFAULT: None

secure

TYPE: bool DEFAULT: False

httponly

TYPE: bool DEFAULT: False

samesite

TYPE: Optional[Literal['lax', 'strict', 'none']] DEFAULT: 'lax'

Source code in starlette/responses.py
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
def set_cookie(
    self,
    key: str,
    value: str = "",
    max_age: typing.Optional[int] = None,
    expires: typing.Optional[typing.Union[datetime, str, int]] = None,
    path: str = "/",
    domain: typing.Optional[str] = None,
    secure: bool = False,
    httponly: bool = False,
    samesite: typing.Optional[Literal["lax", "strict", "none"]] = "lax",
) -> None:
    cookie: "http.cookies.BaseCookie[str]" = http.cookies.SimpleCookie()
    cookie[key] = value
    if max_age is not None:
        cookie[key]["max-age"] = max_age
    if expires is not None:
        if isinstance(expires, datetime):
            cookie[key]["expires"] = format_datetime(expires, usegmt=True)
        else:
            cookie[key]["expires"] = expires
    if path is not None:
        cookie[key]["path"] = path
    if domain is not None:
        cookie[key]["domain"] = domain
    if secure:
        cookie[key]["secure"] = True
    if httponly:
        cookie[key]["httponly"] = True
    if samesite is not None:
        assert samesite.lower() in [
            "strict",
            "lax",
            "none",
        ], "samesite must be either 'strict', 'lax' or 'none'"
        cookie[key]["samesite"] = samesite
    cookie_val = cookie.output(header="").strip()
    self.raw_headers.append((b"set-cookie", cookie_val.encode("latin-1")))
delete_cookie(
    key,
    path="/",
    domain=None,
    secure=False,
    httponly=False,
    samesite="lax",
)
PARAMETER DESCRIPTION
key

TYPE: str

path

TYPE: str DEFAULT: '/'

domain

TYPE: Optional[str] DEFAULT: None

secure

TYPE: bool DEFAULT: False

httponly

TYPE: bool DEFAULT: False

samesite

TYPE: Optional[Literal['lax', 'strict', 'none']] DEFAULT: 'lax'

Source code in starlette/responses.py
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
def delete_cookie(
    self,
    key: str,
    path: str = "/",
    domain: typing.Optional[str] = None,
    secure: bool = False,
    httponly: bool = False,
    samesite: typing.Optional[Literal["lax", "strict", "none"]] = "lax",
) -> None:
    self.set_cookie(
        key,
        max_age=0,
        expires=0,
        path=path,
        domain=domain,
        secure=secure,
        httponly=httponly,
        samesite=samesite,
    )

fastapi.responses.Response

Response(
    content=None,
    status_code=200,
    headers=None,
    media_type=None,
    background=None,
)
PARAMETER DESCRIPTION
content

TYPE: Any DEFAULT: None

status_code

TYPE: int DEFAULT: 200

headers

TYPE: Optional[Mapping[str, str]] DEFAULT: None

media_type

TYPE: Optional[str] DEFAULT: None

background

TYPE: Optional[BackgroundTask] DEFAULT: None

Source code in starlette/responses.py
43
44
45
46
47
48
49
50
51
52
53
54
55
56
def __init__(
    self,
    content: typing.Any = None,
    status_code: int = 200,
    headers: typing.Optional[typing.Mapping[str, str]] = None,
    media_type: typing.Optional[str] = None,
    background: typing.Optional[BackgroundTask] = None,
) -> None:
    self.status_code = status_code
    if media_type is not None:
        self.media_type = media_type
    self.background = background
    self.body = self.render(content)
    self.init_headers(headers)

charset class-attribute instance-attribute

charset = 'utf-8'

status_code instance-attribute

status_code = status_code

media_type class-attribute instance-attribute

media_type = None

body instance-attribute

body = render(content)

background instance-attribute

background = background

headers property

headers

render

render(content)
PARAMETER DESCRIPTION
content

TYPE: Any

Source code in starlette/responses.py
58
59
60
61
62
63
def render(self, content: typing.Any) -> bytes:
    if content is None:
        return b""
    if isinstance(content, bytes):
        return content
    return content.encode(self.charset)

init_headers

init_headers(headers=None)
PARAMETER DESCRIPTION
headers

TYPE: Optional[Mapping[str, str]] DEFAULT: None

Source code in starlette/responses.py
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
def init_headers(
    self, headers: typing.Optional[typing.Mapping[str, str]] = None
) -> None:
    if headers is None:
        raw_headers: typing.List[typing.Tuple[bytes, bytes]] = []
        populate_content_length = True
        populate_content_type = True
    else:
        raw_headers = [
            (k.lower().encode("latin-1"), v.encode("latin-1"))
            for k, v in headers.items()
        ]
        keys = [h[0] for h in raw_headers]
        populate_content_length = b"content-length" not in keys
        populate_content_type = b"content-type" not in keys

    body = getattr(self, "body", None)
    if (
        body is not None
        and populate_content_length
        and not (self.status_code < 200 or self.status_code in (204, 304))
    ):
        content_length = str(len(body))
        raw_headers.append((b"content-length", content_length.encode("latin-1")))

    content_type = self.media_type
    if content_type is not None and populate_content_type:
        if content_type.startswith("text/"):
            content_type += "; charset=" + self.charset
        raw_headers.append((b"content-type", content_type.encode("latin-1")))

    self.raw_headers = raw_headers
set_cookie(
    key,
    value="",
    max_age=None,
    expires=None,
    path="/",
    domain=None,
    secure=False,
    httponly=False,
    samesite="lax",
)
PARAMETER DESCRIPTION
key

TYPE: str

value

TYPE: str DEFAULT: ''

max_age

TYPE: Optional[int] DEFAULT: None

expires

TYPE: Optional[Union[datetime, str, int]] DEFAULT: None

path

TYPE: str DEFAULT: '/'

domain

TYPE: Optional[str] DEFAULT: None

secure

TYPE: bool DEFAULT: False

httponly

TYPE: bool DEFAULT: False

samesite

TYPE: Optional[Literal['lax', 'strict', 'none']] DEFAULT: 'lax'

Source code in starlette/responses.py
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
def set_cookie(
    self,
    key: str,
    value: str = "",
    max_age: typing.Optional[int] = None,
    expires: typing.Optional[typing.Union[datetime, str, int]] = None,
    path: str = "/",
    domain: typing.Optional[str] = None,
    secure: bool = False,
    httponly: bool = False,
    samesite: typing.Optional[Literal["lax", "strict", "none"]] = "lax",
) -> None:
    cookie: "http.cookies.BaseCookie[str]" = http.cookies.SimpleCookie()
    cookie[key] = value
    if max_age is not None:
        cookie[key]["max-age"] = max_age
    if expires is not None:
        if isinstance(expires, datetime):
            cookie[key]["expires"] = format_datetime(expires, usegmt=True)
        else:
            cookie[key]["expires"] = expires
    if path is not None:
        cookie[key]["path"] = path
    if domain is not None:
        cookie[key]["domain"] = domain
    if secure:
        cookie[key]["secure"] = True
    if httponly:
        cookie[key]["httponly"] = True
    if samesite is not None:
        assert samesite.lower() in [
            "strict",
            "lax",
            "none",
        ], "samesite must be either 'strict', 'lax' or 'none'"
        cookie[key]["samesite"] = samesite
    cookie_val = cookie.output(header="").strip()
    self.raw_headers.append((b"set-cookie", cookie_val.encode("latin-1")))
delete_cookie(
    key,
    path="/",
    domain=None,
    secure=False,
    httponly=False,
    samesite="lax",
)
PARAMETER DESCRIPTION
key

TYPE: str

path

TYPE: str DEFAULT: '/'

domain

TYPE: Optional[str] DEFAULT: None

secure

TYPE: bool DEFAULT: False

httponly

TYPE: bool DEFAULT: False

samesite

TYPE: Optional[Literal['lax', 'strict', 'none']] DEFAULT: 'lax'

Source code in starlette/responses.py
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
def delete_cookie(
    self,
    key: str,
    path: str = "/",
    domain: typing.Optional[str] = None,
    secure: bool = False,
    httponly: bool = False,
    samesite: typing.Optional[Literal["lax", "strict", "none"]] = "lax",
) -> None:
    self.set_cookie(
        key,
        max_age=0,
        expires=0,
        path=path,
        domain=domain,
        secure=secure,
        httponly=httponly,
        samesite=samesite,
    )

fastapi.responses.StreamingResponse

StreamingResponse(
    content,
    status_code=200,
    headers=None,
    media_type=None,
    background=None,
)

Bases: Response

PARAMETER DESCRIPTION
content

TYPE: ContentStream

status_code

TYPE: int DEFAULT: 200

headers

TYPE: Optional[Mapping[str, str]] DEFAULT: None

media_type

TYPE: Optional[str] DEFAULT: None

background

TYPE: Optional[BackgroundTask] DEFAULT: None

Source code in starlette/responses.py
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
def __init__(
    self,
    content: ContentStream,
    status_code: int = 200,
    headers: typing.Optional[typing.Mapping[str, str]] = None,
    media_type: typing.Optional[str] = None,
    background: typing.Optional[BackgroundTask] = None,
) -> None:
    if isinstance(content, typing.AsyncIterable):
        self.body_iterator = content
    else:
        self.body_iterator = iterate_in_threadpool(content)
    self.status_code = status_code
    self.media_type = self.media_type if media_type is None else media_type
    self.background = background
    self.init_headers(headers)

body_iterator instance-attribute

body_iterator

charset class-attribute instance-attribute

charset = 'utf-8'

status_code instance-attribute

status_code = status_code

media_type instance-attribute

media_type = (
    media_type if media_type is None else media_type
)

body instance-attribute

body = render(content)

background instance-attribute

background = background

headers property

headers

render

render(content)
PARAMETER DESCRIPTION
content

TYPE: Any

Source code in starlette/responses.py
58
59
60
61
62
63
def render(self, content: typing.Any) -> bytes:
    if content is None:
        return b""
    if isinstance(content, bytes):
        return content
    return content.encode(self.charset)

init_headers

init_headers(headers=None)
PARAMETER DESCRIPTION
headers

TYPE: Optional[Mapping[str, str]] DEFAULT: None

Source code in starlette/responses.py
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
def init_headers(
    self, headers: typing.Optional[typing.Mapping[str, str]] = None
) -> None:
    if headers is None:
        raw_headers: typing.List[typing.Tuple[bytes, bytes]] = []
        populate_content_length = True
        populate_content_type = True
    else:
        raw_headers = [
            (k.lower().encode("latin-1"), v.encode("latin-1"))
            for k, v in headers.items()
        ]
        keys = [h[0] for h in raw_headers]
        populate_content_length = b"content-length" not in keys
        populate_content_type = b"content-type" not in keys

    body = getattr(self, "body", None)
    if (
        body is not None
        and populate_content_length
        and not (self.status_code < 200 or self.status_code in (204, 304))
    ):
        content_length = str(len(body))
        raw_headers.append((b"content-length", content_length.encode("latin-1")))

    content_type = self.media_type
    if content_type is not None and populate_content_type:
        if content_type.startswith("text/"):
            content_type += "; charset=" + self.charset
        raw_headers.append((b"content-type", content_type.encode("latin-1")))

    self.raw_headers = raw_headers
set_cookie(
    key,
    value="",
    max_age=None,
    expires=None,
    path="/",
    domain=None,
    secure=False,
    httponly=False,
    samesite="lax",
)
PARAMETER DESCRIPTION
key

TYPE: str

value

TYPE: str DEFAULT: ''

max_age

TYPE: Optional[int] DEFAULT: None

expires

TYPE: Optional[Union[datetime, str, int]] DEFAULT: None

path

TYPE: str DEFAULT: '/'

domain

TYPE: Optional[str] DEFAULT: None

secure

TYPE: bool DEFAULT: False

httponly

TYPE: bool DEFAULT: False

samesite

TYPE: Optional[Literal['lax', 'strict', 'none']] DEFAULT: 'lax'

Source code in starlette/responses.py
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
def set_cookie(
    self,
    key: str,
    value: str = "",
    max_age: typing.Optional[int] = None,
    expires: typing.Optional[typing.Union[datetime, str, int]] = None,
    path: str = "/",
    domain: typing.Optional[str] = None,
    secure: bool = False,
    httponly: bool = False,
    samesite: typing.Optional[Literal["lax", "strict", "none"]] = "lax",
) -> None:
    cookie: "http.cookies.BaseCookie[str]" = http.cookies.SimpleCookie()
    cookie[key] = value
    if max_age is not None:
        cookie[key]["max-age"] = max_age
    if expires is not None:
        if isinstance(expires, datetime):
            cookie[key]["expires"] = format_datetime(expires, usegmt=True)
        else:
            cookie[key]["expires"] = expires
    if path is not None:
        cookie[key]["path"] = path
    if domain is not None:
        cookie[key]["domain"] = domain
    if secure:
        cookie[key]["secure"] = True
    if httponly:
        cookie[key]["httponly"] = True
    if samesite is not None:
        assert samesite.lower() in [
            "strict",
            "lax",
            "none",
        ], "samesite must be either 'strict', 'lax' or 'none'"
        cookie[key]["samesite"] = samesite
    cookie_val = cookie.output(header="").strip()
    self.raw_headers.append((b"set-cookie", cookie_val.encode("latin-1")))
delete_cookie(
    key,
    path="/",
    domain=None,
    secure=False,
    httponly=False,
    samesite="lax",
)
PARAMETER DESCRIPTION
key

TYPE: str

path

TYPE: str DEFAULT: '/'

domain

TYPE: Optional[str] DEFAULT: None

secure

TYPE: bool DEFAULT: False

httponly

TYPE: bool DEFAULT: False

samesite

TYPE: Optional[Literal['lax', 'strict', 'none']] DEFAULT: 'lax'

Source code in starlette/responses.py
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
def delete_cookie(
    self,
    key: str,
    path: str = "/",
    domain: typing.Optional[str] = None,
    secure: bool = False,
    httponly: bool = False,
    samesite: typing.Optional[Literal["lax", "strict", "none"]] = "lax",
) -> None:
    self.set_cookie(
        key,
        max_age=0,
        expires=0,
        path=path,
        domain=domain,
        secure=secure,
        httponly=httponly,
        samesite=samesite,
    )