共通の依存関係を注入する
データベースセッション、ユーザー認証、エンドポイント間で共有する設定など、共通の依存関係を実装します。
「共通の依存関係を注入する」はCoddyKit上の無料FastAPI Backend Development Bootcampレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはFastAPI Backend Development Bootcamp学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 FastAPI Backend Development Bootcampコースには全4レッスンが含まれています。
このレッスンの一部はまだ翻訳されておらず、英語で表示されています。
Intro to Common Dependencies
In FastAPI, dependencies are powerful. They help you share logic, manage resources, and keep your code clean.
Common dependencies are functions or classes that you reuse across many API endpoints. This prevents repetitive code and makes your application easier to maintain and test.
Think of them as reusable building blocks for your API.
Injecting Shared Configuration
Many applications need global settings, like API keys or database URLs. By injecting configuration, you can easily access these settings in any endpoint without resorting to global variables.
This keeps your configuration flexible and easy to update.
Demo: Simple Config Dependency
Let's create a dependency that returns a simple settings dictionary. In a real application, this might load from environment variables using Pydantic's BaseSettings.
from fastapi import FastAPI, Depends
app = FastAPI()
# This function acts as our dependency
def get_settings():
return {"app_name": "CoddyKit API", "version": "1.0.0"}
@app.get("/info")
def read_info(settings: dict = Depends(get_settings)):
return {"message": f"Welcome to {settings['app_name']} v{settings['version']}"}
# To run this:
# 1. Save as main.py
# 2. Run 'uvicorn main:app --reload'
# 3. Go to http://127.0.0.1:8000/infoDatabase Session Management
A common task for backend APIs is interacting with a database. Each request typically needs its own unique database "session" or connection.
Managing these sessions manually in every endpoint is tedious and error-prone. A dependency can handle creating and closing them automatically for you.
Demo: Database Session Dependency
Here's a simplified example of a get_db dependency. In a real application, this would connect to a database using an ORM like SQLAlchemy.
The yield keyword is key here!
from fastapi import FastAPI, Depends
from typing import Generator
app = FastAPI()
# This simulates a database session.
# In a real app, this would be a SQLAlchemy session.
class MockDBSession:
def __init__(self):
print("Opening DB session...")
def close(self):
print("Closing DB session...")
def query(self, item_id: int):
return {"id": item_id, "name": f"Item {item_id}"}
def get_db() -> Generator:
db = MockDBSession()
try:
yield db # This is where the endpoint gets the 'db' object
finally:
db.close() # This runs after the request is finished
@app.get("/items/{item_id}")
def read_item(item_id: int, db: MockDBSession = Depends(get_db)):
# The 'db' object is provided by the dependency
return db.query(item_id)
# To run this:
# 1. Save as main.py
# 2. Run 'uvicorn main:app --reload'
# 3. Go to http://127.0.0.1:8000/items/1The Magic of `yield`
The yield keyword in our get_db function is very important.
- Code before
yieldruns before the endpoint function. This is for setup (e.g., opening a database connection). - Code after
yieldruns after the endpoint function and its response. This is for teardown (e.g., closing the connection).
This pattern is called a "dependency with yield" or a "context manager dependency".
Injecting User Authentication
Most APIs need to know who is making a request. Authentication dependencies extract user information from request headers (like an API key or JWT token) and make it available to your endpoints.
This keeps your authentication logic separate and reusable across many routes.
Demo: Current User Dependency
Here's a basic dependency that simulates getting the current user. In a real application, this would involve validating a token from the request headers.
If the user isn't authenticated, it can raise an HTTPException to stop the request early.
from fastapi import FastAPI, Depends, HTTPException, status
from typing import Optional
app = FastAPI()
class User:
def __init__(self, username: str, email: Optional[str] = None):
self.username = username
self.email = email
# This dependency simulates fetching the current user
def get_current_user(token: str = "some_valid_token") -> User:
# In a real app, 'token' would come from request headers
# and be validated against a database or auth service.
if token != "some_valid_token":
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Invalid authentication credentials",
headers={"WWW-Authenticate": "Bearer"},
)
return User(username="jane_doe", email="jane@example.com")
@app.get("/me")
def read_current_user(current_user: User = Depends(get_current_user)):
return {"username": current_user.username, "email": current_user.email}
# To run this:
# 1. Save as main.py
# 2. Run 'uvicorn main:app --reload'
# 3. Go to http://127.0.0.1:8000/meChaining & Reusing Dependencies
Dependencies can also depend on other dependencies! This allows for complex logic to be broken down into smaller, manageable pieces.
For example, a "current admin user" dependency might first depend on "current user", then check if that user has admin privileges.
This modularity is a core strength of FastAPI's dependency injection.
Check Your Understanding
Consider the following FastAPI dependency:
from fastapi import HTTPException, status
def check_api_key(api_key: str = "SECRET_KEY"):
if api_key != "VALID_API_KEY":
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail="Invalid API Key"
)
return True
If an endpoint uses Depends(check_api_key) and a request comes in without the correct API_KEY, what will happen?
Common Dependencies: Key Takeaways
We've explored how to inject common dependencies in FastAPI:
- Configuration: Share application settings easily across endpoints.
- Database Sessions: Manage database connections per request using
yieldfor proper setup and teardown. - User Authentication: Centralize logic for identifying and validating users.
Dependencies promote clean, reusable, and testable code by keeping cross-cutting concerns separate from your main endpoint logic.
よくある質問
「共通の依存関係を注入する」レッスンは無料ですか?
はい。「共通の依存関係を注入する」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、FastAPI Backend Development Bootcampコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 FastAPI Backend Development Bootcampコースには全4レッスンが含まれています。
「共通の依存関係を注入する」で何を学びますか?
データベースセッション、ユーザー認証、エンドポイント間で共有する設定など、共通の依存関係を実装します。 ブラウザで直接実行するハンズオンコードでFastAPI Backend Development Bootcampを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
FastAPI Backend Development Bootcampを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのFastAPI Backend Development Bootcampは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「共通の依存関係を注入する」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このFastAPI Backend Development Bootcampレッスンでコードを書いて実行できますか?
はい。すべてのFastAPI Backend Development Bootcampレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。