mirror of
https://github.com/rjNemo/fastapi
synced 2026-06-12 13:36:41 +00:00
🎨 Lint and format tutorial src files
This commit is contained in:
parent
d9fbead646
commit
b0d62b3410
60 changed files with 166 additions and 234 deletions
|
|
@ -2,6 +2,7 @@ from fastapi import FastAPI
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
||||||
@app.get("/")
|
@app.get("/")
|
||||||
async def root():
|
async def root():
|
||||||
return {"message": "Hello World"}
|
return {"message": "Hello World"}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ from fastapi import FastAPI
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
||||||
@app.get("/items/{item_id}")
|
@app.get("/items/{item_id}")
|
||||||
async def read_item(item_id):
|
async def read_item(item_id):
|
||||||
return {"item_id": item_id}
|
return {"item_id": item_id}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ from fastapi import FastAPI
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
||||||
@app.get("/items/{item_id}")
|
@app.get("/items/{item_id}")
|
||||||
async def read_item(item_id: int):
|
async def read_item(item_id: int):
|
||||||
return {"item_id": item_id}
|
return {"item_id": item_id}
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,10 @@
|
||||||
from fastapi import FastAPI
|
|
||||||
from uuid import UUID
|
from uuid import UUID
|
||||||
|
|
||||||
|
from fastapi import FastAPI
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
||||||
@app.get("/items/{item_id}")
|
@app.get("/items/{item_id}")
|
||||||
async def read_item(item_id: UUID):
|
async def read_item(item_id: UUID):
|
||||||
return {"item_id": item_id}
|
return {"item_id": item_id}
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,8 @@ from fastapi import FastAPI
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
fake_items_db = [
|
fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]
|
||||||
{"item_name": "Foo"},
|
|
||||||
{"item_name": "Bar"},
|
|
||||||
{"item_name": "Baz"},
|
|
||||||
]
|
|
||||||
|
|
||||||
@app.get("/items/")
|
@app.get("/items/")
|
||||||
async def read_item(skip: int = 0, limit: int = 100):
|
async def read_item(skip: int = 0, limit: int = 100):
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
from fastapi import FastAPI
|
from fastapi import FastAPI
|
||||||
from fastapi import FastAPI
|
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
||||||
@app.get("/items/{item_id}")
|
@app.get("/items/{item_id}")
|
||||||
async def read_item(item_id: str, q: str = None):
|
async def read_item(item_id: str, q: str = None):
|
||||||
if q:
|
if q:
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,14 @@ from fastapi import FastAPI
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
||||||
@app.get("/items/{item_id}")
|
@app.get("/items/{item_id}")
|
||||||
async def read_item(item_id: str, q: str = None, short: bool = False):
|
async def read_item(item_id: str, q: str = None, short: bool = False):
|
||||||
item = {"item_id": item_id}
|
item = {"item_id": item_id}
|
||||||
if q:
|
if q:
|
||||||
item.update({"q": q})
|
item.update({"q": q})
|
||||||
if not short:
|
if not short:
|
||||||
item.update({"description": "This is an amazing item that has a long description"})
|
item.update(
|
||||||
|
{"description": "This is an amazing item that has a long description"}
|
||||||
|
)
|
||||||
return item
|
return item
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,16 @@ from fastapi import FastAPI
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
||||||
@app.get("/users/{user_id}/items/{item_id}")
|
@app.get("/users/{user_id}/items/{item_id}")
|
||||||
async def read_user_item(user_id: int, item_id: str, q: str = None, short: bool = False):
|
async def read_user_item(
|
||||||
|
user_id: int, item_id: str, q: str = None, short: bool = False
|
||||||
|
):
|
||||||
item = {"item_id": item_id, "owner_id": user_id}
|
item = {"item_id": item_id, "owner_id": user_id}
|
||||||
if q:
|
if q:
|
||||||
item.update({"q": q})
|
item.update({"q": q})
|
||||||
if not short:
|
if not short:
|
||||||
item.update({"description": "This is an amazing item that has a long description"})
|
item.update(
|
||||||
|
{"description": "This is an amazing item that has a long description"}
|
||||||
|
)
|
||||||
return item
|
return item
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,16 @@ from fastapi import FastAPI
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
||||||
@app.get("/users/{user_id}/items/{item_id}")
|
@app.get("/users/{user_id}/items/{item_id}")
|
||||||
async def read_user_item(user_id: int, item_id: str, needy: str, q: str = None, short: bool = False):
|
async def read_user_item(
|
||||||
|
user_id: int, item_id: str, needy: str, q: str = None, short: bool = False
|
||||||
|
):
|
||||||
item = {"item_id": item_id, "owner_id": user_id, "needy": needy}
|
item = {"item_id": item_id, "owner_id": user_id, "needy": needy}
|
||||||
if q:
|
if q:
|
||||||
item.update({"q": q})
|
item.update({"q": q})
|
||||||
if not short:
|
if not short:
|
||||||
item.update({"description": "This is an amazing item that has a long description"})
|
item.update(
|
||||||
|
{"description": "This is an amazing item that has a long description"}
|
||||||
|
)
|
||||||
return item
|
return item
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
from fastapi import FastAPI
|
from fastapi import FastAPI
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
|
||||||
|
|
||||||
class Item(BaseModel):
|
class Item(BaseModel):
|
||||||
name: str
|
name: str
|
||||||
description: str = None
|
description: str = None
|
||||||
|
|
@ -10,6 +11,7 @@ class Item(BaseModel):
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
||||||
@app.post("/items/")
|
@app.post("/items/")
|
||||||
async def create_item(item: Item):
|
async def create_item(item: Item):
|
||||||
return item
|
return item
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
from fastapi import FastAPI
|
from fastapi import FastAPI
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
|
||||||
|
|
||||||
class Item(BaseModel):
|
class Item(BaseModel):
|
||||||
name: str
|
name: str
|
||||||
description: str = None
|
description: str = None
|
||||||
|
|
@ -10,6 +11,7 @@ class Item(BaseModel):
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
||||||
@app.post("/items/")
|
@app.post("/items/")
|
||||||
async def create_item(item: Item):
|
async def create_item(item: Item):
|
||||||
item_dict = item.dict()
|
item_dict = item.dict()
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
from fastapi import FastAPI
|
from fastapi import FastAPI
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
|
||||||
|
|
||||||
class Item(BaseModel):
|
class Item(BaseModel):
|
||||||
name: str
|
name: str
|
||||||
description: str = None
|
description: str = None
|
||||||
|
|
@ -10,6 +11,7 @@ class Item(BaseModel):
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
||||||
@app.put("/items/{item_id}")
|
@app.put("/items/{item_id}")
|
||||||
async def create_item(item_id: int, item: Item):
|
async def create_item(item_id: int, item: Item):
|
||||||
return {"item_id": item_id, **item.dict()}
|
return {"item_id": item_id, **item.dict()}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
from fastapi import FastAPI
|
from fastapi import FastAPI
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
|
||||||
|
|
||||||
class Item(BaseModel):
|
class Item(BaseModel):
|
||||||
name: str
|
name: str
|
||||||
description: str = None
|
description: str = None
|
||||||
|
|
@ -10,6 +11,7 @@ class Item(BaseModel):
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
||||||
@app.put("/items/{item_id}")
|
@app.put("/items/{item_id}")
|
||||||
async def create_item(item_id: int, item: Item, q: str = None):
|
async def create_item(item_id: int, item: Item, q: str = None):
|
||||||
result = {"item_id": item_id, **item.dict()}
|
result = {"item_id": item_id, **item.dict()}
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,9 @@ app = FastAPI()
|
||||||
|
|
||||||
|
|
||||||
@app.get("/items/")
|
@app.get("/items/")
|
||||||
async def read_items(q: str = Query(None, min_length=3, max_length=50, regex="^fixedquery$")):
|
async def read_items(
|
||||||
|
q: str = Query(None, min_length=3, max_length=50, regex="^fixedquery$")
|
||||||
|
):
|
||||||
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
|
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
|
||||||
if q:
|
if q:
|
||||||
results.update({"q": q})
|
results.update({"q": q})
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
from fastapi import FastAPI, Query, Path
|
from fastapi import FastAPI, Path, Query
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,11 @@
|
||||||
from fastapi import FastAPI, Query, Path
|
from fastapi import FastAPI, Path
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
||||||
@app.get("/items/{item_id}")
|
@app.get("/items/{item_id}")
|
||||||
async def read_items(
|
async def read_items(
|
||||||
q: str,
|
q: str, item_id: int = Path(..., title="The ID of the item to get")
|
||||||
item_id: int = Path(..., title="The ID of the item to get"),
|
|
||||||
):
|
):
|
||||||
results = {"item_id": item_id}
|
results = {"item_id": item_id}
|
||||||
if q:
|
if q:
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,11 @@
|
||||||
from fastapi import FastAPI, Query, Path
|
from fastapi import FastAPI, Path
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
||||||
@app.get("/items/{item_id}")
|
@app.get("/items/{item_id}")
|
||||||
async def read_items(
|
async def read_items(
|
||||||
*,
|
*, item_id: int = Path(..., title="The ID of the item to get"), q: str
|
||||||
item_id: int = Path(..., title="The ID of the item to get"),
|
|
||||||
q: str,
|
|
||||||
):
|
):
|
||||||
results = {"item_id": item_id}
|
results = {"item_id": item_id}
|
||||||
if q:
|
if q:
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,11 @@
|
||||||
from fastapi import FastAPI, Query, Path
|
from fastapi import FastAPI, Path
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
||||||
@app.get("/items/{item_id}")
|
@app.get("/items/{item_id}")
|
||||||
async def read_items(
|
async def read_items(
|
||||||
*,
|
*, item_id: int = Path(..., title="The ID of the item to get", ge=1), q: str
|
||||||
item_id: int = Path(..., title="The ID of the item to get", ge=1),
|
|
||||||
q: str,
|
|
||||||
):
|
):
|
||||||
results = {"item_id": item_id}
|
results = {"item_id": item_id}
|
||||||
if q:
|
if q:
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
from fastapi import FastAPI, Query, Path
|
from fastapi import FastAPI, Path
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
from fastapi import FastAPI, Query, Path
|
from fastapi import FastAPI, Path, Query
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
from fastapi import FastAPI, Query, Path
|
from fastapi import FastAPI, Path
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
from fastapi import FastAPI, Query, Path
|
from fastapi import FastAPI
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
@ -17,11 +17,6 @@ class User(BaseModel):
|
||||||
|
|
||||||
|
|
||||||
@app.put("/items/{item_id}")
|
@app.put("/items/{item_id}")
|
||||||
async def update_item(
|
async def update_item(*, item_id: int, item: Item, user: User):
|
||||||
*,
|
|
||||||
item_id: int,
|
|
||||||
item: Item,
|
|
||||||
user: User,
|
|
||||||
):
|
|
||||||
results = {"item_id": item_id, "item": item, "user": user}
|
results = {"item_id": item_id, "item": item, "user": user}
|
||||||
return results
|
return results
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
from fastapi import FastAPI, Query, Path, Body
|
from fastapi import Body, FastAPI
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
@ -18,11 +18,12 @@ class User(BaseModel):
|
||||||
|
|
||||||
@app.put("/items/{item_id}")
|
@app.put("/items/{item_id}")
|
||||||
async def update_item(
|
async def update_item(
|
||||||
*,
|
*, item_id: int, item: Item, user: User, access_token: str = Body(...)
|
||||||
item_id: int,
|
|
||||||
item: Item,
|
|
||||||
user: User,
|
|
||||||
access_token: str = Body(...),
|
|
||||||
):
|
):
|
||||||
results = {"item_id": item_id, "item": item, "user": user, "access_token": access_token}
|
results = {
|
||||||
|
"item_id": item_id,
|
||||||
|
"item": item,
|
||||||
|
"user": user,
|
||||||
|
"access_token": access_token,
|
||||||
|
}
|
||||||
return results
|
return results
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
from fastapi import FastAPI, Query, Path, Body
|
from fastapi import Body, FastAPI
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
@ -25,7 +25,12 @@ async def update_item(
|
||||||
access_token: str = Body(...),
|
access_token: str = Body(...),
|
||||||
q: str = None,
|
q: str = None,
|
||||||
):
|
):
|
||||||
results = {"item_id": item_id, "item": item, "user": user, "access_token": access_token}
|
results = {
|
||||||
|
"item_id": item_id,
|
||||||
|
"item": item,
|
||||||
|
"user": user,
|
||||||
|
"access_token": access_token,
|
||||||
|
}
|
||||||
if q:
|
if q:
|
||||||
results.update({"q": q})
|
results.update({"q": q})
|
||||||
return results
|
return results
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
from fastapi import FastAPI, Query, Path, Body
|
from fastapi import Body, FastAPI
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
@ -12,10 +12,6 @@ class Item(BaseModel):
|
||||||
|
|
||||||
|
|
||||||
@app.put("/items/{item_id}")
|
@app.put("/items/{item_id}")
|
||||||
async def update_item(
|
async def update_item(*, item_id: int, item: Item = Body(..., embed=True)):
|
||||||
*,
|
|
||||||
item_id: int,
|
|
||||||
item: Item = Body(..., embed=True),
|
|
||||||
):
|
|
||||||
results = {"item_id": item_id, "item": item}
|
results = {"item_id": item_id, "item": item}
|
||||||
return results
|
return results
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
from fastapi import FastAPI, Query, Path, Body
|
from fastapi import Body, FastAPI
|
||||||
from pydantic import BaseModel, Schema
|
from pydantic import BaseModel, Schema
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
@ -12,10 +12,6 @@ class Item(BaseModel):
|
||||||
|
|
||||||
|
|
||||||
@app.put("/items/{item_id}")
|
@app.put("/items/{item_id}")
|
||||||
async def update_item(
|
async def update_item(*, item_id: int, item: Item = Body(..., embed=True)):
|
||||||
*,
|
|
||||||
item_id: int,
|
|
||||||
item: Item = Body(..., embed=True),
|
|
||||||
):
|
|
||||||
results = {"item_id": item_id, "item": item}
|
results = {"item_id": item_id, "item": item}
|
||||||
return results
|
return results
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
from fastapi import FastAPI, Query, Path, Body
|
from fastapi import FastAPI
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
@ -13,10 +13,6 @@ class Item(BaseModel):
|
||||||
|
|
||||||
|
|
||||||
@app.put("/items/{item_id}")
|
@app.put("/items/{item_id}")
|
||||||
async def update_item(
|
async def update_item(*, item_id: int, item: Item):
|
||||||
*,
|
|
||||||
item_id: int,
|
|
||||||
item: Item,
|
|
||||||
):
|
|
||||||
results = {"item_id": item_id, "item": item}
|
results = {"item_id": item_id, "item": item}
|
||||||
return results
|
return results
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
from fastapi import Body, FastAPI, Path, Query
|
|
||||||
from pydantic import BaseModel
|
|
||||||
from typing import List
|
from typing import List
|
||||||
|
|
||||||
|
from fastapi import FastAPI
|
||||||
|
from pydantic import BaseModel
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -14,10 +15,6 @@ class Item(BaseModel):
|
||||||
|
|
||||||
|
|
||||||
@app.put("/items/{item_id}")
|
@app.put("/items/{item_id}")
|
||||||
async def update_item(
|
async def update_item(*, item_id: int, item: Item):
|
||||||
*,
|
|
||||||
item_id: int,
|
|
||||||
item: Item,
|
|
||||||
):
|
|
||||||
results = {"item_id": item_id, "item": item}
|
results = {"item_id": item_id, "item": item}
|
||||||
return results
|
return results
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
from fastapi import Body, FastAPI, Path, Query
|
|
||||||
from pydantic import BaseModel
|
|
||||||
from typing import Set
|
from typing import Set
|
||||||
|
|
||||||
|
from fastapi import FastAPI
|
||||||
|
from pydantic import BaseModel
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -14,10 +15,6 @@ class Item(BaseModel):
|
||||||
|
|
||||||
|
|
||||||
@app.put("/items/{item_id}")
|
@app.put("/items/{item_id}")
|
||||||
async def update_item(
|
async def update_item(*, item_id: int, item: Item):
|
||||||
*,
|
|
||||||
item_id: int,
|
|
||||||
item: Item,
|
|
||||||
):
|
|
||||||
results = {"item_id": item_id, "item": item}
|
results = {"item_id": item_id, "item": item}
|
||||||
return results
|
return results
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
from fastapi import Body, FastAPI, Path, Query
|
|
||||||
from pydantic import BaseModel
|
|
||||||
from typing import Set
|
from typing import Set
|
||||||
|
|
||||||
|
from fastapi import FastAPI
|
||||||
|
from pydantic import BaseModel
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -20,10 +21,6 @@ class Item(BaseModel):
|
||||||
|
|
||||||
|
|
||||||
@app.put("/items/{item_id}")
|
@app.put("/items/{item_id}")
|
||||||
async def update_item(
|
async def update_item(*, item_id: int, item: Item):
|
||||||
*,
|
|
||||||
item_id: int,
|
|
||||||
item: Item,
|
|
||||||
):
|
|
||||||
results = {"item_id": item_id, "item": item}
|
results = {"item_id": item_id, "item": item}
|
||||||
return results
|
return results
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
from fastapi import Body, FastAPI, Path, Query
|
from typing import Set
|
||||||
|
|
||||||
|
from fastapi import FastAPI
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
from pydantic.types import UrlStr
|
from pydantic.types import UrlStr
|
||||||
from typing import Set
|
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
@ -21,10 +22,6 @@ class Item(BaseModel):
|
||||||
|
|
||||||
|
|
||||||
@app.put("/items/{item_id}")
|
@app.put("/items/{item_id}")
|
||||||
async def update_item(
|
async def update_item(*, item_id: int, item: Item):
|
||||||
*,
|
|
||||||
item_id: int,
|
|
||||||
item: Item,
|
|
||||||
):
|
|
||||||
results = {"item_id": item_id, "item": item}
|
results = {"item_id": item_id, "item": item}
|
||||||
return results
|
return results
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
from fastapi import Body, FastAPI, Path, Query
|
from typing import List, Set
|
||||||
|
|
||||||
|
from fastapi import FastAPI
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
from pydantic.types import UrlStr
|
from pydantic.types import UrlStr
|
||||||
from typing import Set, List
|
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
@ -21,10 +22,6 @@ class Item(BaseModel):
|
||||||
|
|
||||||
|
|
||||||
@app.put("/items/{item_id}")
|
@app.put("/items/{item_id}")
|
||||||
async def update_item(
|
async def update_item(*, item_id: int, item: Item):
|
||||||
*,
|
|
||||||
item_id: int,
|
|
||||||
item: Item,
|
|
||||||
):
|
|
||||||
results = {"item_id": item_id, "item": item}
|
results = {"item_id": item_id, "item": item}
|
||||||
return results
|
return results
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
from fastapi import Body, FastAPI, Path, Query
|
from typing import List, Set
|
||||||
|
|
||||||
|
from fastapi import FastAPI
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
from pydantic.types import UrlStr
|
from pydantic.types import UrlStr
|
||||||
from typing import Set, List
|
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
from fastapi import Body, FastAPI, Path, Query
|
from typing import List
|
||||||
|
|
||||||
|
from fastapi import FastAPI
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
from pydantic.types import UrlStr
|
from pydantic.types import UrlStr
|
||||||
from typing import Set, List
|
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,4 @@
|
||||||
from fastapi import FastAPI, Cookie
|
from fastapi import Cookie, FastAPI
|
||||||
from pydantic import BaseModel
|
|
||||||
from pydantic.types import UrlStr
|
|
||||||
from typing import Set, List
|
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,4 @@
|
||||||
from fastapi import FastAPI, Header
|
from fastapi import FastAPI, Header
|
||||||
from pydantic import BaseModel
|
|
||||||
from pydantic.types import UrlStr
|
|
||||||
from typing import Set, List
|
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,4 @@
|
||||||
from fastapi import FastAPI, Header
|
from fastapi import FastAPI, Header
|
||||||
from pydantic import BaseModel
|
|
||||||
from pydantic.types import UrlStr
|
|
||||||
from typing import Set, List
|
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
from fastapi import Body, FastAPI, Path, Query
|
from typing import Set
|
||||||
|
|
||||||
|
from fastapi import FastAPI
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
from pydantic.types import UrlStr
|
|
||||||
from typing import Set, List
|
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
from fastapi import Body, FastAPI, Path, Query
|
from fastapi import FastAPI
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
from pydantic.types import EmailStr
|
from pydantic.types import EmailStr
|
||||||
from typing import Set, List
|
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
@ -13,7 +12,6 @@ class UserIn(BaseModel):
|
||||||
full_name: str = None
|
full_name: str = None
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Don't do this in production!
|
# Don't do this in production!
|
||||||
@app.post("/user/", response_model=UserIn)
|
@app.post("/user/", response_model=UserIn)
|
||||||
async def create_user(*, user: UserIn):
|
async def create_user(*, user: UserIn):
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
from fastapi import Body, FastAPI, Path, Query
|
from fastapi import FastAPI
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
from pydantic.types import EmailStr
|
from pydantic.types import EmailStr
|
||||||
from typing import Set, List
|
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,6 @@
|
||||||
from fastapi import Body, FastAPI, Path, Query
|
from fastapi import FastAPI
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
from pydantic.types import EmailStr
|
from pydantic.types import EmailStr
|
||||||
from typing import Set, List
|
|
||||||
from uuid import UUID, uuid4
|
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
@ -37,6 +35,7 @@ def fake_save_user(user_in: UserIn):
|
||||||
print("User saved! ..not really")
|
print("User saved! ..not really")
|
||||||
return user_in_db
|
return user_in_db
|
||||||
|
|
||||||
|
|
||||||
@app.post("/user/", response_model=UserOut)
|
@app.post("/user/", response_model=UserOut)
|
||||||
async def create_user(*, user_in: UserIn):
|
async def create_user(*, user_in: UserIn):
|
||||||
user_saved = fake_save_user(user_in)
|
user_saved = fake_save_user(user_in)
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,16 @@
|
||||||
from fastapi import Body, FastAPI, Path, Query
|
from fastapi import FastAPI
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
from pydantic.types import EmailStr
|
from pydantic.types import EmailStr
|
||||||
from typing import Set, List
|
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
||||||
class UserBase(BaseModel):
|
class UserBase(BaseModel):
|
||||||
username: str
|
username: str
|
||||||
email: EmailStr
|
email: EmailStr
|
||||||
full_name: str = None
|
full_name: str = None
|
||||||
|
|
||||||
|
|
||||||
class UserIn(UserBase):
|
class UserIn(UserBase):
|
||||||
password: str
|
password: str
|
||||||
|
|
||||||
|
|
@ -17,6 +18,7 @@ class UserIn(UserBase):
|
||||||
class UserOut(UserBase):
|
class UserOut(UserBase):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class UserInDB(UserBase):
|
class UserInDB(UserBase):
|
||||||
hashed_password: str
|
hashed_password: str
|
||||||
|
|
||||||
|
|
@ -31,6 +33,7 @@ def fake_save_user(user_in: UserIn):
|
||||||
print("User saved! ..not really")
|
print("User saved! ..not really")
|
||||||
return user_in_db
|
return user_in_db
|
||||||
|
|
||||||
|
|
||||||
@app.post("/user/", response_model=UserOut)
|
@app.post("/user/", response_model=UserOut)
|
||||||
async def create_user(*, user_in: UserIn):
|
async def create_user(*, user_in: UserIn):
|
||||||
user_saved = fake_save_user(user_in)
|
user_saved = fake_save_user(user_in)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,4 @@
|
||||||
from fastapi import Body, FastAPI, Path, Query, Form
|
from fastapi import FastAPI, Form
|
||||||
from pydantic import BaseModel
|
|
||||||
from pydantic.types import EmailStr
|
|
||||||
from typing import Set, List
|
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,4 @@
|
||||||
from fastapi import Body, FastAPI, Path, Query, File
|
from fastapi import FastAPI, File
|
||||||
from pydantic import BaseModel
|
|
||||||
from pydantic.types import EmailStr
|
|
||||||
from typing import Set, List
|
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,4 @@
|
||||||
from fastapi import Body, FastAPI, Path, Query, File, Form
|
from fastapi import FastAPI, File, Form
|
||||||
from pydantic import BaseModel
|
|
||||||
from pydantic.types import EmailStr
|
|
||||||
from typing import Set, List
|
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
from fastapi import Body, FastAPI, Path, Query
|
from typing import Set
|
||||||
from starlette.status import HTTP_201_CREATED
|
|
||||||
|
from fastapi import FastAPI
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
from pydantic.types import UrlStr
|
from starlette.status import HTTP_201_CREATED
|
||||||
from typing import Set, List
|
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,7 @@
|
||||||
from fastapi import Body, FastAPI, Path, Query
|
from typing import Set
|
||||||
from starlette.status import HTTP_201_CREATED
|
|
||||||
|
from fastapi import FastAPI
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
from pydantic.types import UrlStr
|
|
||||||
from typing import Set, List
|
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,7 @@
|
||||||
from fastapi import Body, FastAPI, Path, Query
|
from typing import Set
|
||||||
from starlette.status import HTTP_201_CREATED
|
|
||||||
|
from fastapi import FastAPI
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
from pydantic.types import UrlStr
|
|
||||||
from typing import Set, List
|
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,7 @@
|
||||||
from fastapi import Body, FastAPI, Path, Query
|
from typing import Set
|
||||||
from starlette.status import HTTP_201_CREATED
|
|
||||||
|
from fastapi import FastAPI
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
from pydantic.types import UrlStr
|
|
||||||
from typing import Set, List
|
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,7 @@
|
||||||
from fastapi import Body, FastAPI, Path, Query
|
from typing import Set
|
||||||
from starlette.status import HTTP_201_CREATED
|
|
||||||
|
from fastapi import FastAPI
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
from pydantic.types import UrlStr
|
|
||||||
from typing import Set, List
|
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
@ -15,7 +14,12 @@ class Item(BaseModel):
|
||||||
tags: Set[str] = []
|
tags: Set[str] = []
|
||||||
|
|
||||||
|
|
||||||
@app.post("/items/", response_model=Item, summary="Create an item", response_description="The created item")
|
@app.post(
|
||||||
|
"/items/",
|
||||||
|
response_model=Item,
|
||||||
|
summary="Create an item",
|
||||||
|
response_description="The created item",
|
||||||
|
)
|
||||||
async def create_item(*, item: Item):
|
async def create_item(*, item: Item):
|
||||||
"""
|
"""
|
||||||
Create an item with all the information:
|
Create an item with all the information:
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,4 @@
|
||||||
from typing import List, Set
|
from fastapi import FastAPI
|
||||||
|
|
||||||
from fastapi import Body, FastAPI, Path, Query
|
|
||||||
from pydantic import BaseModel
|
|
||||||
from pydantic.types import UrlStr
|
|
||||||
from starlette.status import HTTP_201_CREATED
|
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,4 @@
|
||||||
from typing import List, Set
|
from fastapi import FastAPI
|
||||||
|
|
||||||
from fastapi import Body, FastAPI, Path, Query
|
|
||||||
from pydantic import BaseModel
|
|
||||||
from pydantic.types import UrlStr
|
|
||||||
from starlette.status import HTTP_201_CREATED
|
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,4 @@
|
||||||
from typing import List, Set
|
from fastapi import FastAPI
|
||||||
|
|
||||||
from fastapi import Body, FastAPI, Path, Query
|
|
||||||
from pydantic import BaseModel
|
|
||||||
from pydantic.types import UrlStr
|
|
||||||
from starlette.status import HTTP_201_CREATED
|
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,4 @@
|
||||||
from typing import List, Set
|
from fastapi import FastAPI
|
||||||
|
|
||||||
from fastapi import Body, FastAPI, Path, Query
|
|
||||||
from pydantic import BaseModel
|
|
||||||
from pydantic.types import UrlStr
|
|
||||||
from starlette.status import HTTP_201_CREATED
|
|
||||||
from starlette.responses import UJSONResponse
|
from starlette.responses import UJSONResponse
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,4 @@
|
||||||
from typing import List, Set
|
from fastapi import FastAPI
|
||||||
|
|
||||||
from fastapi import Body, FastAPI, Path, Query
|
|
||||||
from pydantic import BaseModel
|
|
||||||
from pydantic.types import UrlStr
|
|
||||||
from starlette.status import HTTP_201_CREATED
|
|
||||||
from starlette.responses import HTMLResponse
|
from starlette.responses import HTMLResponse
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,5 @@
|
||||||
from typing import List, Set
|
from fastapi import Depends, FastAPI
|
||||||
|
|
||||||
from fastapi import Body, FastAPI, Path, Query, Depends
|
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
from pydantic.types import UrlStr
|
|
||||||
from starlette.status import HTTP_201_CREATED
|
|
||||||
from starlette.responses import HTMLResponse
|
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,7 @@
|
||||||
from typing import List, Set
|
from typing import List
|
||||||
|
|
||||||
from fastapi import Body, FastAPI, Path, Query, Depends, Cookie
|
from fastapi import Cookie, Depends, FastAPI
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
from pydantic.types import UrlStr
|
|
||||||
from starlette.status import HTTP_201_CREATED
|
|
||||||
from starlette.responses import HTMLResponse
|
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
@ -30,6 +27,8 @@ async def get_tracked_interests(track_code: str = Cookie(None)):
|
||||||
|
|
||||||
|
|
||||||
@app.get("/interests/")
|
@app.get("/interests/")
|
||||||
async def read_interests(tracked_interests: InterestsTracker = Depends(get_tracked_interests)):
|
async def read_interests(
|
||||||
|
tracked_interests: InterestsTracker = Depends(get_tracked_interests)
|
||||||
|
):
|
||||||
response = {"interests": tracked_interests.interests}
|
response = {"interests": tracked_interests.interests}
|
||||||
return response
|
return response
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,8 @@
|
||||||
from typing import List, Set
|
|
||||||
|
|
||||||
from fastapi import Body, FastAPI, Path, Query, Depends, Cookie
|
|
||||||
from pydantic import BaseModel
|
|
||||||
from pydantic.types import UrlStr
|
|
||||||
from starlette.status import HTTP_201_CREATED
|
|
||||||
from starlette.responses import HTMLResponse
|
|
||||||
from random import choice
|
from random import choice
|
||||||
|
from typing import List
|
||||||
|
|
||||||
|
from fastapi import Cookie, Depends, FastAPI
|
||||||
|
from pydantic import BaseModel
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
@ -21,6 +18,7 @@ fake_tracked_users_db = {
|
||||||
"Baz": {"track_code": "Baz", "interests": ["gaming", "virtual reality"]},
|
"Baz": {"track_code": "Baz", "interests": ["gaming", "virtual reality"]},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
async def get_tracked_interests(track_code: str = Cookie(None)):
|
async def get_tracked_interests(track_code: str = Cookie(None)):
|
||||||
if track_code in fake_tracked_users_db:
|
if track_code in fake_tracked_users_db:
|
||||||
track_dict = fake_tracked_users_db[track_code]
|
track_dict = fake_tracked_users_db[track_code]
|
||||||
|
|
@ -28,6 +26,7 @@ async def get_tracked_interests(track_code: str = Cookie(None)):
|
||||||
return track
|
return track
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
class ComplexTracker:
|
class ComplexTracker:
|
||||||
def __init__(self, tracker: InterestsTracker = Depends(get_tracked_interests)):
|
def __init__(self, tracker: InterestsTracker = Depends(get_tracked_interests)):
|
||||||
self.tracker = tracker
|
self.tracker = tracker
|
||||||
|
|
@ -39,7 +38,9 @@ class ComplexTracker:
|
||||||
"""
|
"""
|
||||||
if self.tracker.interests:
|
if self.tracker.interests:
|
||||||
return choice(self.tracker.interests)
|
return choice(self.tracker.interests)
|
||||||
return choice(["sports", "movies", "food", "shows", "gaming", "virtual reality"])
|
return choice(
|
||||||
|
["sports", "movies", "food", "shows", "gaming", "virtual reality"]
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@app.get("/suggested-category")
|
@app.get("/suggested-category")
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,8 @@
|
||||||
from typing import List, Set
|
from fastapi import FastAPI
|
||||||
|
|
||||||
from fastapi import Body, FastAPI, Path, Query, Depends, Cookie
|
from sqlalchemy import Boolean, Column, Integer, String, create_engine
|
||||||
from pydantic import BaseModel
|
|
||||||
from pydantic.types import UrlStr
|
|
||||||
from starlette.status import HTTP_201_CREATED
|
|
||||||
from starlette.responses import HTMLResponse
|
|
||||||
from random import choice
|
|
||||||
|
|
||||||
from sqlalchemy import create_engine
|
|
||||||
from sqlalchemy.orm import scoped_session, sessionmaker
|
|
||||||
from sqlalchemy import Column, Integer, DateTime, String, Boolean, ForeignKey
|
|
||||||
from sqlalchemy.ext.declarative import declarative_base, declared_attr
|
from sqlalchemy.ext.declarative import declarative_base, declared_attr
|
||||||
|
from sqlalchemy.orm import scoped_session, sessionmaker
|
||||||
|
|
||||||
# SQLAlchemy specific code, as with any other app
|
# SQLAlchemy specific code, as with any other app
|
||||||
|
|
||||||
|
|
@ -22,6 +13,7 @@ SQLALCHEMY_DATABASE_URI = "postgresql://user:password@postgresserver/db"
|
||||||
# automatic __tablename__ attributes. So you don't have to declare them.
|
# automatic __tablename__ attributes. So you don't have to declare them.
|
||||||
# So, your models will behave very similarly to, for example, Flask-SQLAlchemy
|
# So, your models will behave very similarly to, for example, Flask-SQLAlchemy
|
||||||
|
|
||||||
|
|
||||||
class CustomBase:
|
class CustomBase:
|
||||||
# Generate __tablename__ automatically
|
# Generate __tablename__ automatically
|
||||||
@declared_attr
|
@declared_attr
|
||||||
|
|
@ -49,6 +41,7 @@ db_session = scoped_session(
|
||||||
def get_user(username, db_session):
|
def get_user(username, db_session):
|
||||||
return db_session.query(User).filter(User.id == username).first()
|
return db_session.query(User).filter(User.id == username).first()
|
||||||
|
|
||||||
|
|
||||||
# FastAPI specific code
|
# FastAPI specific code
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,21 +1,12 @@
|
||||||
from typing import List, Set
|
from typing import Optional
|
||||||
|
|
||||||
from fastapi import Body, FastAPI, Path, Query, Depends, Cookie
|
|
||||||
from pydantic import BaseModel
|
|
||||||
from pydantic.types import UrlStr
|
|
||||||
from starlette.status import HTTP_201_CREATED
|
|
||||||
from starlette.responses import HTMLResponse
|
|
||||||
from random import choice
|
|
||||||
|
|
||||||
from typing import List, Optional, Union
|
|
||||||
|
|
||||||
|
from fastapi import FastAPI
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
|
||||||
from app.models.config import USERPROFILE_DOC_TYPE
|
from app.models.config import USERPROFILE_DOC_TYPE
|
||||||
from app.models.role import RoleEnum
|
from couchbase import LOCKMODE_WAIT
|
||||||
from couchbase.bucket import Bucket
|
from couchbase.bucket import Bucket
|
||||||
from couchbase.cluster import Cluster, PasswordAuthenticator
|
from couchbase.cluster import Cluster, PasswordAuthenticator
|
||||||
from couchbase import LOCKMODE_WAIT
|
|
||||||
|
|
||||||
|
|
||||||
def get_bucket():
|
def get_bucket():
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue