0Pricing
Python Academy · Урок

Внедрение зависимостей и аутентификация

Используйте систему DI FastAPI для общей логики и аутентификацию на основе JWT.

«Внедрение зависимостей и аутентификация» — бесплатный урок Python Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.

Что такое внедрение зависимостей?

Depends() в FastAPI позволяет объявить общую логику (сеансы базы данных, проверки аутентификации, конфигурацию), которая автоматически внедряется в обработчики маршрутов.

from fastapi import FastAPI, Depends
app = FastAPI()

def get_db():
    db = connect_db()
    try: yield db
    finally: db.close()

@app.get("/users")
def list_users(db = Depends(get_db)):
    return db.query_all("users")

Функции зависимостей

Зависимостью может быть любой вызываемый объект. Это может быть функция, класс или другая функция, использующая зависимости.

from fastapi import Depends, FastAPI
app = FastAPI()

def common_params(skip: int = 0, limit: int = 10):
    return {"skip": skip, "limit": limit}

@app.get("/items")
def list_items(params: dict = Depends(common_params)):
    return params

@app.get("/users")
def list_users(params: dict = Depends(common_params)):
    return params

Зависимости-классы

Используйте класс как зависимость, чтобы объединить связанные настройки. Класс вызывается с внедрёнными аргументами __init__.

from fastapi import Depends, FastAPI, Query
app = FastAPI()

class Pagination:
    def __init__(self, page: int = Query(1,ge=1), size: int = Query(10,ge=1,le=100)):
        self.page = page
        self.size = size
        self.offset = (page - 1) * size

@app.get("/items")
def list_items(pag: Pagination = Depends()):
    return {"offset": pag.offset, "size": pag.size}

Bearer-токен OAuth2

Используйте OAuth2PasswordBearer, чтобы прочитать Bearer-токен из заголовка Authorization.

from fastapi import FastAPI, Depends
from fastapi.security import OAuth2PasswordBearer
app = FastAPI()

oauth2 = OAuth2PasswordBearer(tokenUrl="/token")

@app.get("/me")
def me(token: str = Depends(oauth2)):
    return {"token": token}   # validate token here

Токены JWT

Создавайте и проверяйте токены JWT с помощью python-jose (или pyjwt). Возвращайте токен при входе в систему и проверяйте его в каждом защищённом маршруте.

# pip install python-jose passlib
from jose import jwt, JWTError

SECRET_KEY = "change-me"
ALGORITHM = "HS256"

def create_token(data: dict) -> str:
    return jwt.encode(data, SECRET_KEY, algorithm=ALGORITHM)

def verify_token(token: str) -> dict:
    return jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])

Зависимость текущего пользователя

Создайте зависимость get_current_user, которая проверяет JWT и возвращает аутентифицированного пользователя.

from fastapi import Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer
from jose import jwt, JWTError

oauth2 = OAuth2PasswordBearer(tokenUrl="/token")

def get_current_user(token: str = Depends(oauth2)):
    try:
        payload = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
        return payload["sub"]
    except JWTError:
        raise HTTPException(status_code=401, detail="Invalid token")

# @app.get("/me")
# def me(user=Depends(get_current_user)): return user

Хеширование паролей

Никогда не храните пароли в открытом виде. Используйте passlib для хеширования с помощью bcrypt.

from passlib.context import CryptContext

pwd_ctx = CryptContext(schemes=["bcrypt"], deprecated="auto")

def hash_pw(plain: str) -> str:
    return pwd_ctx.hash(plain)

def verify_pw(plain: str, hashed: str) -> bool:
    return pwd_ctx.verify(plain, hashed)

Конечная точка токена

Реализуйте POST /token, которая принимает учётные данные формы, проверяет пароль и возвращает JWT.

from fastapi import FastAPI, Depends, HTTPException
from fastapi.security import OAuth2PasswordRequestForm
app = FastAPI()

@app.post("/token")
def login(form: OAuth2PasswordRequestForm = Depends()):
    user = get_user_by_username(form.username)
    if not user or not verify_pw(form.password, user.hashed_pw):
        raise HTTPException(status_code=401, detail="Bad credentials")
    token = create_token({"sub": form.username})
    return {"access_token": token, "token_type": "bearer"}

Аутентификация по ключу API

В более простых случаях проверяйте ключ API, переданный в заголовке или параметре запроса.

from fastapi import Depends, HTTPException, Security
from fastapi.security import APIKeyHeader

API_KEY_HEADER = APIKeyHeader(name="X-API-Key")

def require_api_key(key: str = Security(API_KEY_HEADER)):
    if key != "secret-key":
        raise HTTPException(status_code=403, detail="Forbidden")
    return key

Управление доступом на основе ролей

Добавляйте проверку ролей в зависимости, чтобы расширить аутентификацию разрешениями.

from fastapi import Depends, HTTPException

def require_admin(user=Depends(get_current_user)):
    if user.get("role") != "admin":
        raise HTTPException(status_code=403, detail="Admins only")
    return user

# @app.delete("/users/{uid}")
# def delete_user(uid: int, admin=Depends(require_admin)):

Кэширование зависимостей

По умолчанию зависимость вызывается один раз для каждого запроса, а её результат используется всеми маршрутами, которые применяют эту зависимость в рамках запроса.

# The same db session object is shared:
@app.get("/summary")
def summary(
    db = Depends(get_db),      # db resolved once
    stats = Depends(get_stats) # get_stats also uses get_db — same db instance
): ...

Быстрая проверка

Что делает Depends() в FastAPI?

Итоги

Используйте Depends(func), чтобы внедрять общую логику. Реализуйте аутентификацию с помощью OAuth2PasswordBearer, JWT-токенов и зависимости get_current_user. Хешируйте пароли с помощью passlib/bcrypt. Добавляйте проверки ролей как дополнительные зависимости.

Часто задаваемые вопросы

Урок «Внедрение зависимостей и аутентификация» бесплатный?

Да — полный текст урока «Внедрение зависимостей и аутентификация» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.

Чему я научусь в уроке «Внедрение зависимостей и аутентификация»?

Используйте систему DI FastAPI для общей логики и аутентификацию на основе JWT. Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Python Academy?

Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Внедрение зависимостей и аутентификация»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Python Academy?

Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Настройка проекта FastAPI и первая конечная точка
  2. Параметры пути, параметры запроса и тела запросов
  3. Внедрение зависимостей и аутентификация
  4. Асинхронные конечные точки и интеграция с базой данных
← Назад к Python Academy