📖 Scenario: You are building a simple web API using FastAPI. The API will accept a username from users. You want to make sure the username is valid by checking its length and pattern.
🎯 Goal: Create a FastAPI app that accepts a username string with these rules: minimum length 3, maximum length 10, and only letters and numbers allowed. Use Pydantic string validation with min_length, max_length, and regex.
📋 What You'll Learn
Create a FastAPI app instance called app
Create a Pydantic model called User with a username field
Validate username with min_length=3, max_length=10, and a regex that allows only letters and numbers
Create a POST endpoint /users/ that accepts a User model and returns the username
💡 Why This Matters
🌍 Real World
Validating user input is essential in web APIs to prevent bad data and security issues. FastAPI with Pydantic makes this easy and clear.
💼 Career
Backend developers often need to validate incoming data. Knowing how to use FastAPI and Pydantic validation is a valuable skill for building reliable APIs.
Progress0 / 4 steps
1
Create FastAPI app and User model with username field
Write code to import FastAPI and BaseModel from pydantic. Create a FastAPI app instance called app. Create a Pydantic model called User with a single field username of type str.
FastAPI
Hint
Start by importing FastAPI and BaseModel. Then create app = FastAPI(). Define User class inheriting from BaseModel with a username field of type str.
2
Add validation rules to username field
Modify the username field in the User model to add validation: set min_length=3, max_length=10, and a regex pattern that allows only letters and numbers. Use Field(..., min_length=3, max_length=10, regex="^[a-zA-Z0-9]+$").
FastAPI
Hint
Import Field from pydantic. Use Field(..., min_length=3, max_length=10, regex="^[a-zA-Z0-9]+$") to add validation to username.
3
Create POST endpoint to accept User model
Add a POST endpoint /users/ to the FastAPI app. The endpoint should accept a User model as input and return a dictionary with the key username and the value from the input model.
FastAPI
Hint
Use @app.post("/users/") decorator. Define async function create_user with parameter user: User. Return dictionary with username key and user.username value.
4
Add response model to endpoint
Modify the POST endpoint /users/ to include a response_model=User parameter in the decorator. This ensures the response matches the User model.
FastAPI
Hint
Add response_model=User inside the @app.post decorator parentheses.
Practice
(1/5)
1. What does the constr function in FastAPI's Pydantic models help you do?
easy
A. Validate string fields with rules like minimum length, maximum length, and regex patterns
B. Create integer fields with range validation
C. Automatically generate API documentation
D. Handle database connections
Solution
Step 1: Understand constr purpose
constr is a Pydantic type used to validate string fields with constraints like length and regex.
Step 2: Compare options
Only Validate string fields with rules like minimum length, maximum length, and regex patterns correctly describes constr usage for string validation.
Final Answer:
Validate string fields with rules like minimum length, maximum length, and regex patterns -> Option A
Quick Check:
constr = string validation [OK]
Hint: Remember constr is for string validation rules [OK]
Common Mistakes:
Confusing constr with integer validation
Thinking constr manages database or docs
Assuming constr auto-generates API docs
2. Which of the following is the correct way to define a string field in a Pydantic model with minimum length 3 and maximum length 10?
easy
A. name: str(min_length=3, max_length=10)
B. name: constr(min=3, max=10)
C. name: constr(min_length=3, max_length=10)
D. name: str(min=3, max=10)
Solution
Step 1: Recall correct syntax for constr
The correct parameters are min_length and max_length inside constr().
Step 2: Check options
Only name: constr(min_length=3, max_length=10) uses constr(min_length=3, max_length=10) correctly. Options A, B, and D use wrong parameter names or types.
Final Answer:
name: constr(min_length=3, max_length=10) -> Option C
Quick Check:
Use min_length and max_length in constr [OK]
Hint: Use min_length and max_length, not min or max [OK]
Common Mistakes:
Using min and max instead of min_length and max_length
Trying to add length constraints directly to str type
Mixing parameter names
3. Given this Pydantic model snippet:
from pydantic import BaseModel, constr
class User(BaseModel):
username: constr(min_length=4, max_length=8, regex=r'^[a-zA-Z]+$')
What happens if you try to create User(username='abc123')?
medium
A. Validation error because username is too long
B. User instance created successfully
C. Validation error because username is too short
D. Validation error because username contains digits
Solution
Step 1: Analyze regex pattern
The regex r'^[a-zA-Z]+$' allows only letters, no digits.
Step 2: Check input username
Input 'abc123' contains digits '123', violating the regex.
Final Answer:
Validation error because username contains digits -> Option D
Quick Check:
Regex restricts digits, so error occurs [OK]
Hint: Regex restricts characters; digits cause validation error [OK]
Common Mistakes:
Ignoring regex and only checking length
Assuming digits are allowed by regex
Confusing length errors with pattern errors
4. Identify the error in this FastAPI Pydantic model field:
from pydantic import BaseModel, constr
class Item(BaseModel):
code: constr(min_length=5, max=10)
medium
A. code field must be an int, not constr
B. max should be max_length to specify maximum string length
C. constr cannot be used for string validation
D. min_length should be min to specify minimum length
Solution
Step 1: Check parameter names in constr
The correct parameter for maximum length is max_length, not max.
Step 2: Identify error in code
Using max=10 causes a syntax or validation error because it's invalid.
Final Answer:
max should be max_length to specify maximum string length -> Option B
Quick Check:
Use max_length, not max, in constr [OK]
Hint: Use max_length, not max, for string max length [OK]
Common Mistakes:
Using max instead of max_length
Confusing min_length with min
Thinking constr is for int fields
5. You want to create a FastAPI model field password that must be between 8 and 16 characters and include at least one digit. Which is the correct way to define it?
hard
A. password: constr(min_length=8, max_length=16, regex=r'^(?=.*\\d).+$')
B. password: constr(min_length=8, max_length=16, regex=r'^[a-zA-Z]+$')
C. password: constr(min=8, max=16, regex=r'^(?=.*\\d).+$')
D. password: str(min_length=8, max_length=16, regex=r'^(?=.*\\d).+$')
Solution
Step 1: Check length parameters
Use min_length=8 and max_length=16 in constr for length limits.
Step 2: Verify regex for digit inclusion
The regex r'^(?=.*\\d).+$' ensures at least one digit is present.
Step 3: Validate option correctness
password: constr(min_length=8, max_length=16, regex=r'^(?=.*\\d).+$') correctly combines length and regex. password: constr(min_length=8, max_length=16, regex=r'^[a-zA-Z]+$')'s regex disallows digits. password: constr(min=8, max=16, regex=r'^(?=.*\\d).+$') uses invalid min and max. password: str(min_length=8, max_length=16, regex=r'^(?=.*\\d).+$') wrongly applies regex to str type.
Final Answer:
password: constr(min_length=8, max_length=16, regex=r'^(?=.*\\d).+$') -> Option A
Quick Check:
Use constr with min_length, max_length, and digit regex [OK]
Hint: Use constr with min_length, max_length, and digit regex [OK]
Common Mistakes:
Using min and max instead of min_length and max_length
Using regex that excludes digits
Trying to add regex to plain str type
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.