First Check
Commit to Help
Example Code
import json
from pydantic import BaseModel, Field
from fastapi import FastAPI
from fastapi import __version__ as fastapi_version
class Model(BaseModel):
field: str = Field("foo", const=True)
app = FastAPI(title=f"Created with FastAPI v{fastapi_version}")
@app.get("/", response_model=Model)
def root():
return Model(field="foo")
print(json.dumps(Model.schema(), indent=2))
print(json.dumps(app.openapi(), indent=2))
Description
With fastapi==0.68.0 and pydantic==1.8.2, the above MWE produces an invalid OpenAPI schema due to the handling of extra keys introduced in the last release. The inclusion of the const key is not supported in OpenAPI 3 (see Supported Keywords).
Here is a diff between the schema created for v0.65.2 vs v0.68 (also tested with 0.66, 0.67 with the same results).
// ...
},
"components": {
"schemas": {
"Model": {
"title": "Model",
"type": "object",
"properties": {
"field": {
"title": "Field",
"type": "string",
+ "const": "foo"
}
// ...
This regression is caused by the addition of extra = "allow" to fastapi.openapi.models.Schema in (#1429) (see also the comment #1429 (comment)). This is something we ran into when updating FastAPI at Materials-Consortia/optimade-python-tools#887.
While I would also like to be able to use extension keys (with the appropriate x- prefix) too, this change now makes it hard to use some standard pydantic features. My suggestion would be to enumerate the keys from JSON schema that OpenAPI does not support (linked above) and handle those separately in the Config for Schema. Perhaps any "extra" key that is not in this list could be prepended with a x-my-app prefix defined on the init of the FastAPI instance. I'm happy to have a go at implementing this, if desired.
Operating System
Linux
Operating System Details
No response
FastAPI Version
0.68.0
Python Version
3.8.5
Additional Context
I've made two gists for the OpenAPI schemas from v0.68.0 and v0.65.2:
You can pass the raw json through the online swagger validator to verify:
First Check
Commit to Help
Example Code
Description
With
fastapi==0.68.0andpydantic==1.8.2, the above MWE produces an invalid OpenAPI schema due to the handling of extra keys introduced in the last release. The inclusion of theconstkey is not supported in OpenAPI 3 (see Supported Keywords).Here is a diff between the schema created for v0.65.2 vs v0.68 (also tested with 0.66, 0.67 with the same results).
// ... }, "components": { "schemas": { "Model": { "title": "Model", "type": "object", "properties": { "field": { "title": "Field", "type": "string", + "const": "foo" } // ...This regression is caused by the addition of
extra = "allow"tofastapi.openapi.models.Schemain (#1429) (see also the comment #1429 (comment)). This is something we ran into when updating FastAPI at Materials-Consortia/optimade-python-tools#887.While I would also like to be able to use extension keys (with the appropriate
x-prefix) too, this change now makes it hard to use some standard pydantic features. My suggestion would be to enumerate the keys from JSON schema that OpenAPI does not support (linked above) and handle those separately in theConfigforSchema. Perhaps any "extra" key that is not in this list could be prepended with ax-my-appprefix defined on the init of theFastAPIinstance. I'm happy to have a go at implementing this, if desired.Operating System
Linux
Operating System Details
No response
FastAPI Version
0.68.0
Python Version
3.8.5
Additional Context
I've made two gists for the OpenAPI schemas from v0.68.0 and v0.65.2:
You can pass the raw json through the online swagger validator to verify:
0.65.2: https://validator.swagger.io/validator/debug?url=https://gist.githubusercontent.com/ml-evs/99b33f68b74a0c197e970f9222faa2bc/raw/71d056de37a942bb9bc26943151c477a97aa18f4/fastapi_v0.65.2_openapi.json
$ curl -s https://validator.swagger.io/validator/debug\?url\=https://gist.githubusercontent.com/ml-evs/99b33f68b74a0c197e970f9222faa2bc/raw/71d056de37a942bb9bc26943151c477a97aa18f4/fastapi_v0.65.2_openapi.json | jq {}0.68.0: https://validator.swagger.io/validator/debug?url=https://gist.githubusercontent.com/ml-evs/824f9ac510f92d4e180a4e984d1da38d/raw/d25b9c3a7802702ced6e3f7a1aa60e017ac9b339/fastapi_v0.68.0_openapi.json