]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
:sparkles: Update requests with body, rename params
authorSebastián Ramírez <tiangolo@gmail.com>
Sat, 8 Dec 2018 07:55:36 +0000 (11:55 +0400)
committerSebastián Ramírez <tiangolo@gmail.com>
Sat, 8 Dec 2018 07:55:36 +0000 (11:55 +0400)
12 files changed:
fastapi/applications.py
fastapi/dependencies/models.py
fastapi/dependencies/utils.py
fastapi/openapi/constants.py
fastapi/openapi/utils.py
fastapi/params.py
fastapi/routing.py
fastapi/security/api_key.py
fastapi/security/http.py
fastapi/security/oauth2.py
fastapi/security/open_id_connect_url.py
fastapi/utils.py

index f1d40522186c5fa87f5ad8cbbd70ce98230780c8..b6b4538d29ca857e48b1044896c35e7a73ed5f4e 100644 (file)
@@ -1,5 +1,8 @@
 from typing import Any, Callable, Dict, List, Optional, Type
 
+from fastapi import routing
+from fastapi.openapi.docs import get_redoc_html, get_swagger_ui_html
+from fastapi.openapi.utils import get_openapi
 from pydantic import BaseModel
 from starlette.applications import Starlette
 from starlette.exceptions import ExceptionMiddleware, HTTPException
@@ -8,10 +11,6 @@ from starlette.middleware.lifespan import LifespanMiddleware
 from starlette.requests import Request
 from starlette.responses import JSONResponse, Response
 
-from fastapi import routing
-from fastapi.openapi.docs import get_redoc_html, get_swagger_ui_html
-from fastapi.openapi.utils import get_openapi
-
 
 async def http_exception(request: Request, exc: HTTPException) -> JSONResponse:
     return JSONResponse({"detail": exc.detail}, status_code=exc.status_code)
index 5857f9202aca792137583241f55d2fc51d0519ea..da5d9b72df2f8a03f530c7a5d82aae12163c6934 100644 (file)
@@ -1,5 +1,6 @@
 from typing import Any, Callable, Dict, List, Sequence, Tuple
 
+from fastapi.security.base import SecurityBase
 from pydantic import BaseConfig, Schema
 from pydantic.error_wrappers import ErrorWrapper
 from pydantic.errors import MissingError
@@ -8,8 +9,6 @@ from pydantic.schema import get_annotation_from_schema
 from starlette.concurrency import run_in_threadpool
 from starlette.requests import Request
 
-from fastapi.security.base import SecurityBase
-
 param_supported_types = (str, int, float, bool)
 
 
index 834774e1bfe5e799217f2f1f5607f3769ed3c554..d91c832551bc718bd33976771c86835f3237dabb 100644 (file)
@@ -3,6 +3,10 @@ import inspect
 from copy import deepcopy
 from typing import Any, Callable, Dict, List, Mapping, Sequence, Tuple, Type
 
+from fastapi import params
+from fastapi.dependencies.models import Dependant, SecurityRequirement
+from fastapi.security.base import SecurityBase
+from fastapi.utils import get_path_param_names
 from pydantic import BaseConfig, Schema, create_model
 from pydantic.error_wrappers import ErrorWrapper
 from pydantic.errors import MissingError
@@ -12,11 +16,6 @@ from pydantic.utils import lenient_issubclass
 from starlette.concurrency import run_in_threadpool
 from starlette.requests import Request
 
-from fastapi import params
-from fastapi.dependencies.models import Dependant, SecurityRequirement
-from fastapi.security.base import SecurityBase
-from fastapi.utils import get_path_param_names
-
 param_supported_types = (str, int, float, bool)
 
 
@@ -26,7 +25,6 @@ def get_sub_dependant(*, param: inspect.Parameter, path: str) -> Dependant:
         dependency = depends.dependency
     else:
         dependency = param.annotation
-    assert callable(dependency)
     sub_dependant = get_dependant(path=path, call=dependency, name=param.name)
     if isinstance(depends, params.Security) and isinstance(dependency, SecurityBase):
         security_requirement = SecurityRequirement(
@@ -119,18 +117,18 @@ def add_param_to_fields(
     if isinstance(default_value, params.Param):
         schema = default_value
         default_value = schema.default
-        if schema.in_ is None:
+        if getattr(schema, "in_", None) is None:
             schema.in_ = default_schema.in_
         if force_type:
             schema.in_ = force_type
     else:
         schema = default_schema(default_value)
     required = default_value == Required
-    annotation: Type = Type[Any]
+    annotation: Any = Any
     if not param.annotation == param.empty:
         annotation = param.annotation
     annotation = get_annotation_from_schema(annotation, schema)
-    if not schema.alias and getattr(schema, "alias_underscore_to_hyphen", None):
+    if not schema.alias and getattr(schema, "convert_underscores", None):
         alias = param.name.replace("_", "-")
     else:
         alias = schema.alias or param.name
index 1d94a33776f64e75e3324fdcc2c24e358fa0f798..3b50b05bd963bfbce1eb5a0950a1fe61426a10fd 100644 (file)
@@ -1,2 +1,2 @@
-METHODS_WITH_BODY = set(("POST", "PUT"))
+METHODS_WITH_BODY = set(("POST", "PUT", "DELETE", "PATCH"))
 REF_PREFIX = "#/components/schemas/"
index 1036d201241a92c0ed4b8eb9a87a904bd9896c85..bb75a024ec7de15e98d31a635d2065f8b786310e 100644 (file)
@@ -1,12 +1,5 @@
 from typing import Any, Dict, List, Optional, Sequence, Tuple, Type
 
-from pydantic.fields import Field
-from pydantic.schema import Schema, field_schema, get_model_name_map
-from pydantic.utils import lenient_issubclass
-from starlette.responses import HTMLResponse, JSONResponse
-from starlette.routing import BaseRoute, Route
-from starlette.status import HTTP_422_UNPROCESSABLE_ENTITY
-
 from fastapi import routing
 from fastapi.dependencies.models import Dependant
 from fastapi.dependencies.utils import get_flat_dependant
@@ -15,6 +8,12 @@ from fastapi.openapi.constants import METHODS_WITH_BODY, REF_PREFIX
 from fastapi.openapi.models import OpenAPI
 from fastapi.params import Body, Param
 from fastapi.utils import get_flat_models_from_routes, get_model_definitions
+from pydantic.fields import Field
+from pydantic.schema import Schema, field_schema, get_model_name_map
+from pydantic.utils import lenient_issubclass
+from starlette.responses import HTMLResponse, JSONResponse
+from starlette.routing import BaseRoute, Route
+from starlette.status import HTTP_422_UNPROCESSABLE_ENTITY
 
 validation_error_definition = {
     "title": "ValidationError",
index 8df0112c8e5cc4d219ef6a232245011a55b14e08..ab71954ea073ef6d52c45d9b64f3ea4fe41df62d 100644 (file)
@@ -134,7 +134,7 @@ class Header(Param):
         *,
         deprecated: bool = None,
         alias: str = None,
-        alias_underscore_to_hyphen: bool = True,
+        convert_underscores: bool = True,
         title: str = None,
         description: str = None,
         gt: float = None,
@@ -148,7 +148,7 @@ class Header(Param):
     ):
         self.description = description
         self.deprecated = deprecated
-        self.alias_underscore_to_hyphen = alias_underscore_to_hyphen
+        self.convert_underscores = convert_underscores
         super().__init__(
             default,
             alias=alias,
index 8620db5db5fbbeabfccafdde5ced36dd6b68b5e8..4293f97ff6e659f52569b042876c442b1de5de1c 100644 (file)
@@ -2,6 +2,10 @@ import asyncio
 import inspect
 from typing import Any, Callable, List, Optional, Type
 
+from fastapi import params
+from fastapi.dependencies.models import Dependant
+from fastapi.dependencies.utils import get_body_field, get_dependant, solve_dependencies
+from fastapi.encoders import jsonable_encoder
 from pydantic import BaseConfig, BaseModel, Schema
 from pydantic.error_wrappers import ErrorWrapper, ValidationError
 from pydantic.fields import Field
@@ -15,11 +19,6 @@ from starlette.responses import JSONResponse, Response
 from starlette.routing import get_name, request_response
 from starlette.status import HTTP_422_UNPROCESSABLE_ENTITY
 
-from fastapi import params
-from fastapi.dependencies.models import Dependant
-from fastapi.dependencies.utils import get_body_field, get_dependant, solve_dependencies
-from fastapi.encoders import jsonable_encoder
-
 
 def serialize_response(*, field: Field = None, response: Response) -> Any:
     if field:
index c4b045b715bcc4f5471b93dd72a41581cb8d73b8..12eba37ee7d2462a1a001f764aba54172f02a133 100644 (file)
@@ -1,7 +1,6 @@
-from starlette.requests import Request
-
 from fastapi.openapi.models import APIKey, APIKeyIn
 from fastapi.security.base import SecurityBase
+from starlette.requests import Request
 
 
 class APIKeyBase(SecurityBase):
index 480a1ae546f5e883e5abab9282f7222728e8fbf8..b1cba1921fd24b013ae815b107926ea096fea9d3 100644 (file)
@@ -1,10 +1,9 @@
-from starlette.requests import Request
-
 from fastapi.openapi.models import (
     HTTPBase as HTTPBaseModel,
     HTTPBearer as HTTPBearerModel,
 )
 from fastapi.security.base import SecurityBase
+from starlette.requests import Request
 
 
 class HTTPBase(SecurityBase):
index 90838fdad08aaf5319718e444a9b21abb4cc458e..717a3287f17df6c11cf86036537e9b4a93711985 100644 (file)
@@ -1,7 +1,39 @@
-from starlette.requests import Request
+from typing import List, Optional
 
 from fastapi.openapi.models import OAuth2 as OAuth2Model, OAuthFlows as OAuthFlowsModel
 from fastapi.security.base import SecurityBase
+from pydantic import BaseModel, Schema
+from starlette.requests import Request
+
+
+class OAuth2PasswordRequestData(BaseModel):
+    grant_type: str = "password"
+    username: str
+    password: str
+    scope: Optional[List[str]] = None
+    # Client ID and secret might come from headers
+    client_id: Optional[str] = None
+    client_secret: Optional[str] = None
+
+
+class OAuth2PasswordRequestForm(BaseModel):
+    grant_type: str = Schema(..., regex="password")  # it must have the value "password"
+    username: str
+    password: str
+    scope: str = ""
+    # Client ID and secret might come from headers
+    client_id: Optional[str] = None
+    client_secret: Optional[str] = None
+
+    def parse(self) -> OAuth2PasswordRequestData:
+        return OAuth2PasswordRequestData(
+            grant_type=self.grant_type,
+            username=self.username,
+            password=self.password,
+            scope=self.scope.split(),
+            client_id=self.client_id,
+            client_secret=self.client_secret,
+        )
 
 
 class OAuth2(SecurityBase):
index b6c0a32dc412f42a9abb78366248f6e09795d373..7d73ed81f388ca620af2c768d7f6fc85281e299c 100644 (file)
@@ -1,7 +1,6 @@
-from starlette.requests import Request
-
 from fastapi.openapi.models import OpenIdConnect as OpenIdConnectModel
 from fastapi.security.base import SecurityBase
+from starlette.requests import Request
 
 
 class OpenIdConnect(SecurityBase):
index 81ca910cfaa5f3c319cfbcaa64780b039057f391..f3b4df82e8887ba92893f859b64c180214cd48d6 100644 (file)
@@ -1,14 +1,13 @@
 import re
 from typing import Any, Dict, List, Sequence, Set, Type
 
+from fastapi import routing
+from fastapi.openapi.constants import REF_PREFIX
 from pydantic import BaseModel
 from pydantic.fields import Field
 from pydantic.schema import get_flat_models_from_fields, model_process_schema
 from starlette.routing import BaseRoute
 
-from fastapi import routing
-from fastapi.openapi.constants import REF_PREFIX
-
 
 def get_flat_models_from_routes(
     routes: Sequence[Type[BaseRoute]]