Skip to content

flask_restx_marshmallow.namespace ¤

patched namespace of flask_restx_marshmallow.

Namespace ¤

Bases: Namespace

Patched Namespace.

parameters ¤

parameters(
    params: type[DataclassInstance | Parameters]
    | Parameters,
    *,
    location: Location
    | Literal[
        "query",
        "header",
        "formData",
        "body",
        "cookie",
        "path",
    ]
    | None = None,
    as_kwargs: bool = False,
    validate: Callable[[dict], bool] | None = None,
    **kwargs: Unpack[SchemaInitKwargs],
) -> Callable[
    [
        Callable[P, TupleResponse[A] | Response | A]
        | type[M]
    ],
    Callable[P, TupleResponse[A] | Response | A]
    | type[M],
]

Endpoint parameters registration decorator.

Parameters:

Name Type Description Default

params ¤

subclass[DataclassInstance | Parameters] | Parameters

parameters class or instance.

required

as_kwargs ¤

bool

whether set parameters as key word arguments arguments or not. Defaults to False.

False

validate ¤

dict) -> bool

validation function. Defaults to None.

None

location ¤

Location

location of the parameters. Defaults to None.

None

**kwargs ¤

ParamsInitKwargs

parameters initialization keyword.

{}

Raises:

Type Description
TypeError

if params is not subclass of Parameters

Returns:

Type Description
((((...) -> (TupleResponse | Response | Any)) | subclass[MethodView])) -> (((...) -> (TupleResponse | Response | Any)) | subclass[MethodView])

decorator.

Source code in flask_restx_marshmallow/namespace.py
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
def parameters[A, T: "DataclassInstance", M: "MethodView", **P](
    self: Self,
    params: "type[DataclassInstance | Parameters] | Parameters",
    *,
    location: Location
    | Literal["query", "header", "formData", "body", "cookie", "path"]
    | None = None,
    as_kwargs: bool = False,
    validate: "Callable[[dict], bool] | None" = None,
    **kwargs: Unpack["SchemaInitKwargs"],
) -> Callable[
    [Callable[P, TupleResponse[A] | Response | A] | type[M]],
    Callable[P, TupleResponse[A] | Response | A] | type[M],
]:
    """Endpoint parameters registration decorator.

    Args:
        params (subclass[DataclassInstance | Parameters] | Parameters): parameters class or instance.
        as_kwargs (bool, optional): whether set parameters as key word arguments
            arguments or not. Defaults to False.
        validate ((dict) -> bool, optional): validation function. Defaults to None.
        location (Location, optional): location of the parameters. Defaults to None.
        **kwargs (ParamsInitKwargs): parameters initialization keyword.

    Raises:
        TypeError: if params is not subclass of Parameters

    Returns:
        (((((...) -> (TupleResponse | Response | Any)) | subclass[MethodView])) -> (((...) -> (TupleResponse | Response | Any)) | subclass[MethodView])): decorator.


    """  # noqa: E501
    if is_dataclass(params):
        params = class_schema(params, base=Parameters, use_origin_load=as_kwargs)
    if isinstance(params, type) and issubclass(params, Parameters):
        params = params(location=location, **kwargs)
    elif not isinstance(params, Parameters):
        msg = f"params must be subclass of Parameters, got {type(params).__name__}"
        raise TypeError(msg)

    def decorator(
        func_or_class: Callable[P, TupleResponse[A] | Response | A] | type[M],
    ) -> Callable[P, TupleResponse[A] | Response | A] | type[M]:
        """Decorator.

        Args:
            func_or_class (((...) -> (TupleResponse | Response | Any)) | subclass[MethodView]): function or class to decorate.

        Raises:
            ValueError: if location is None.

        Returns:
            ((...) -> (TupleResponse | Response | Any)) | subclass[MethodView]) -> (((...) -> (TupleResponse | Response | Any)) | subclass[MethodView]) : decorated function or class.
        """  # noqa: E501
        locations = params.locations
        if None in locations:
            msg = f"location must be specified, {params} has None location."
            raise ValueError(msg)
        if not isinstance(func_or_class, type):
            # * function case
            return parser.use_args(
                params,
                location="auto",
                as_kwargs=as_kwargs,
                validate=validate,
            )(self.doc(params=params)(func_or_class))
        # * class case
        func_or_class.decorators.append(
            parser.use_args(
                params,
                location="auto",
                as_kwargs=as_kwargs,
                validate=validate,
            )(self.doc(params=params)),
        )
        return func_or_class

    return decorator

responses ¤

responses(
    *,
    success: bool = True,
    code: HTTPStatus | int = OK,
    schema: type[T | Schema] | Schema | None = None,
    message: str | None = None,
    headers: Iterable[str] | None = None,
    **kwargs: Unpack[SchemaInitKwargs],
) -> Callable[
    [
        Callable[P, TupleResponse[A] | Response | A]
        | type[M]
    ],
    Callable[P, TupleResponse[A] | Response | A]
    | type[M],
]

Endpoint response OpenAPI documentation decorator.

Parameters:

Name Type Description Default

success ¤

bool

whether response is successful or not. Defaults to True.

True

code ¤

HTTPStatus | int

response status code. Defaults to HTTPStatus.OK.

OK

message ¤

str

response message. Defaults to None.

None

schema ¤

subclass[DataclassInstance | Schema] | Schema

schema class or instance.

None

headers ¤

Iterable[str]

header fields. Defaults to None.

None

**kwargs ¤

SchemaInitKwargs

schema initialization keyword arguments.

{}

Raises:

Type Description
TypeError

if schema is not subclass of Schema.

Returns:

Type Description
((((...) -> (TupleResponse | Response | Any)) | subclass[MethodView])) -> (((...) -> (TupleResponse | Response | Any)) | subclass[MethodView])

decorator.

Source code in flask_restx_marshmallow/namespace.py
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
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
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
def responses[A, T: "DataclassInstance", M: "MethodView", **P](  # noqa: C901
    self: Self,
    *,
    success: bool = True,
    code: HTTPStatus | int = HTTPStatus.OK,
    schema: "type[T | Schema] | Schema | None" = None,
    message: str | None = None,
    headers: Iterable[str] | None = None,
    **kwargs: Unpack["SchemaInitKwargs"],
) -> Callable[
    [Callable[P, TupleResponse[A] | Response | A] | type[M]],
    Callable[P, TupleResponse[A] | Response | A] | type[M],
]:
    """Endpoint response OpenAPI documentation decorator.

    Args:
        success (bool, optional): whether response is successful or not. Defaults to True.
        code (HTTPStatus | int, optional): response status code. Defaults to HTTPStatus.OK.
        message (str, optional): response message. Defaults to None.
        schema (subclass[DataclassInstance | Schema] | Schema, optional): schema class or instance.
        headers (Iterable[str], optional): header fields. Defaults to None.
        **kwargs (SchemaInitKwargs): schema initialization keyword arguments.

    Raises:
        TypeError: if schema is not subclass of Schema.

    Returns:
       (((((...) -> (TupleResponse | Response | Any)) | subclass[MethodView])) -> (((...) -> (TupleResponse | Response | Any)) | subclass[MethodView])): decorator.
    """  # noqa: E501
    if is_dataclass(schema):
        schema = class_schema(schema, base=Schema)
    if isinstance(schema, type) and issubclass(schema, Schema):
        schema = schema(header_fields=headers, **kwargs)
    elif not isinstance(schema, Schema) and schema is not None:
        msg = f"schema must be subclass of Schema, got {type(schema).__name__}"
        raise TypeError(msg)

    def decorator(
        func_or_class: Callable[P, TupleResponse[A] | Response | A] | type[M],
    ) -> Callable[P, TupleResponse[A] | Response | A] | type[M]:
        """Decorator.

        Args:
            func_or_class (((...) -> (TupleResponse | Response | Any)) | subclass[MethodView]): function or class to decorate.

        Returns:
            ((...) -> (TupleResponse | Response | Any)) | subclass[MethodView]) -> (((...) -> (TupleResponse | Response | Any)) | subclass[MethodView]) : decorated function or class.
        """  # noqa: E501
        if schema is None:
            splits = func_or_class.__qualname__.split(".")
            name = f"{''.join(s.capitalize() for s in splits)}Schema"
            schema_ = make_default_schema(
                name,
                success=success,
                code=code,
                message=message,
            )(**kwargs)
            doc = parse_from_object(func_or_class)
            schema_.description = (
                doc.long_description or doc.short_description or schema_.description
            )
        else:
            schema_ = schema
            name = type(schema_).__name__
            doc = parse_from_object(schema_)
            schema_.description = (
                doc.long_description or doc.short_description or schema_.description
            )
        body_schema = schema_.copy_body_fields()
        header_schema = schema_.copy_header_fields()
        if not isinstance(func_or_class, type):
            # * function case

            @wraps(func_or_class)
            def wrapper(
                *args: P.args,
                **kwargs: P.kwargs,
            ) -> TupleResponse[A] | Response | A:
                """Wrapper.

                Args:
                    *args (P.args): arguments
                    **kwargs (P.kwargs): key word arguments

                Returns:
                    TupleResponse | Response | Any: response
                """
                resp = func_or_class(*args, **kwargs)
                extra_headers = {}

                if isinstance(resp, Response):
                    return resp
                if isinstance(resp, tuple):
                    response, status_code, extra_headers = unpack(resp)
                else:
                    response = Success(result=resp)
                    status_code = HTTPStatus.OK
                if HTTPStatus(status_code) is HTTPStatus(code):
                    response = body_schema.dump(response)
                    extra_headers = header_schema.dump(extra_headers)
                return TupleResponse(
                    response=response,
                    status_code=status_code,
                    extra_headers=extra_headers,
                )

            return self.doc(responses={str(HTTPStatus(code)): schema_})(wrapper)
        func_or_class.decorators.append(
            self.doc(responses={str(HTTPStatus(code)): schema_}),
        )
        return func_or_class

    return decorator

security ¤

security(
    security: S | Sequence[S],
) -> Callable[
    [
        Callable[P, TupleResponse[A] | Response | A]
        | type[M]
    ],
    Callable[P, TupleResponse[A] | Response | A]
    | type[M],
]

Endpoint security decorator.

Parameters:

Name Type Description Default

security ¤

S | Sequence[S]

security name or instance.

required

Returns:

Type Description
((((...) -> (TupleResponse | Response | Any)) | subclass[MethodView])) -> (((...) -> (TupleResponse | Response | Any)) | subclass[MethodView])

decorator.

Source code in flask_restx_marshmallow/namespace.py
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
142
143
144
145
146
def security[A, S: str | Mapping[str, list[str] | str], M: "MethodView", **P](
    self: Self,
    security: S | Sequence[S],
) -> Callable[
    [Callable[P, TupleResponse[A] | Response | A] | type[M]],
    Callable[P, TupleResponse[A] | Response | A] | type[M],
]:
    """Endpoint security decorator.

    Args:
        security (S | Sequence[S]): security name or instance.

    Returns:
        (((((...) -> (TupleResponse | Response | Any)) | subclass[MethodView])) -> (((...) -> (TupleResponse | Response | Any)) | subclass[MethodView])): decorator.
    """  # noqa: E501
    security_ = (
        [security_helper(security)]
        if not isinstance(security, Sequence)
        else [security_helper(s) for s in security]
    )

    def decorator(
        func_or_class: Callable[P, TupleResponse[A] | Response | A] | type[M],
    ) -> Callable[P, TupleResponse[A] | Response | A] | type[M]:
        """Decorator.

        Args:
            func_or_class (((...) -> (TupleResponse | Response | Any)) | subclass[MethodView]): function or class to decorate.

        Returns:
            ((...) -> (TupleResponse | Response | Any)) | subclass[MethodView]) -> (((...) -> (TupleResponse | Response | Any)) | subclass[MethodView]) : decorated function or class.
        """  # noqa: E501
        if not isinstance(func_or_class, type):
            # * function case
            return self.doc(security=security_)(func_or_class)
        # * class case
        func_or_class.decorators.append(self.doc(security=security_))
        return func_or_class

    return decorator

load_data ¤

load_data(request: Request, params: Parameters) -> dict

Load data from locations.

Parameters:

Name Type Description Default

request ¤

Request

request

required

params ¤

Parameters

parameters

required

Raises:

Type Description
BadRequest

if request is not JSON

Returns:

Name Type Description
MultiDictProxy dict

json data

Source code in flask_restx_marshmallow/namespace.py
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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
@parser.location_loader("auto")
def load_data(request: "Request", params: "Parameters") -> "dict":
    """Load data from locations.

    Args:
        request (Request): request
        params (Parameters): parameters

    Raises:
        BadRequest: if request is not JSON

    Returns:
        MultiDictProxy: json data
    """
    data = {}
    if "body" in params.locations:
        if is_json_request(request) is False:
            raise BadRequest(description="Invalid JSON body.")
        data.update(json.loads(request.get_data(cache=True)))
    for field, location, is_multiple in params.field_locations:
        match location:
            case "path":
                data[field] = (
                    missing
                    if request.view_args is None
                    else unquote(value)
                    if (value := request.view_args.get(field))
                    else missing
                )
            case "formData":
                data[field] = (
                    [
                        unquote(value) if value else missing
                        for value in request.form.getlist(field)
                    ]
                    or request.files.getlist(field)
                    if is_multiple
                    else unquote(_data)
                    if (_data := request.form.get(field))
                    else missing or request.files.get(field, missing)
                )
            case "query":
                values = [unquote(value) for value in request.args.getlist(field)] or [
                    missing,
                ]
                data[field] = values if is_multiple else values[0]
            case "header":
                values = [
                    unquote(value) for value in request.headers.getlist(field)
                ] or [missing]
                data[field] = values if is_multiple else values[0]
            case "cookie":
                values = [
                    unquote(value) for value in request.cookies.getlist(field)
                ] or [missing]
                data[field] = values if is_multiple else values[0]
    return data