TaskBuild the signup form matching the Pydantic Signup schema. Use a <form method='post' action='/api/signup'>. Inside one <fieldset><legend>Account</legend>: email + password. Second <fieldset><legend>Profile</legend>: age, country select (us/ua/de), bio textarea, accepted_tos checkbox. End with a submit button. Use labels, autocomplete, and validation attributes throughout.
Module capstone: signup form matching a Pydantic schema
200 XP14 min
Theory
Putting A3 together
Your FastAPI endpoint:
class Signup(BaseModel):
email: EmailStr
password: str = Field(min_length=8)
age: int = Field(ge=13, le=120)
country: Literal["us", "ua", "de"]
bio: str = Field(default="", max_length=500)
accepted_tos: bool
@app.post("/api/signup")
async def signup(data: Annotated[Signup, Form()]):
return dataYour job: build the HTML form whose request body matches this schema 1:1. Field names match. Validation matches. autocomplete hints are set. Labels are linked. Group into fieldsets.
What "matches" means
- For
email: EmailStrβ<input type="email" name="email" required autocomplete="email"> - For
password: Field(min_length=8)β<input type="password" name="password" required minlength="8" autocomplete="new-password"> - For
age: Field(ge=13, le=120)β<input type="number" name="age" required min="13" max="120"> - For
country: Literal["us", "ua", "de"]β<select name="country" required>with those three options - For
bio: Field(max_length=500)β<textarea name="bio" maxlength="500">(NOT required since default="") - For
accepted_tos: boolβ<input type="checkbox" name="accepted_tos" value="yes" required>
This is the API contract first mindset that the rest of A3 led up to.
π
Sign up to start coding
Theory is open to everyone. The interactive editor, live preview, and check are unlocked with a 7-day free trial β card required, cancel anytime.
Sign up β free trial βFirst 10 lessons in each track are free. No card needed for those.