← Назад к вопросам

Для чего используются параметры запроса (query-параметры) в Django, FastAPI и других фреймворках?

1.2 Junior🔥 291 комментариев
#Django#FastAPI и Flask#REST API и HTTP

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Query-параметры в веб-фреймворках

Query-параметры (параметры строки запроса) — это переменные данные, передаваемые в URL адресе после символа ?. Они используются для фильтрации, сортировки и настройки поведения запроса.

Назначение query-параметров

Фильтрация данных:

  • GET /api/users?status=active — получить только активных пользователей
  • GET /api/posts?author_id=123 — посты конкретного автора
  • GET /api/products?min_price=100&max_price=500 — товары в диапазоне цен

Поиск:

  • GET /api/search?q=python&limit=10 — поиск по ключевому слову
  • GET /api/articles?tag=django — статьи с определённым тегом

Пагинация:

  • GET /api/posts?page=2&per_page=20 — вторая страница с 20 элементами
  • GET /api/comments?offset=100&limit=50 — с пропуском первых 100

Сортировка:

  • GET /api/products?sort=price&order=asc — сортировка по цене по возрастанию
  • GET /api/posts?sort=-created_at — новые посты первыми

Django: работа с query-параметрами

from django.shortcuts import render
from django.http import JsonResponse
from .models import Post

def post_list(request):
    # Получение параметров запроса
    page = request.GET.get("page", 1)
    status = request.GET.get("status", "published")
    sort_by = request.GET.get("sort", "-created_at")
    
    # Фильтрация и сортировка
    posts = Post.objects.filter(status=status).order_by(sort_by)
    
    # Пагинация
    from django.core.paginator import Paginator
    paginator = Paginator(posts, 10)
    page_obj = paginator.get_page(page)
    
    return render(request, "posts/list.html", {"page_obj": page_obj})

request.GET — словарь-подобный объект, содержащий все параметры запроса:

def search(request):
    query = request.GET.get("q")  # Получить один параметр
    filters = request.GET.getlist("tags")  # Получить список значений
    all_params = request.GET.dict()  # Все параметры в виде словаря
    
    # request.GET.get возвращает None, если параметра нет
    limit = int(request.GET.get("limit", 20))  # Дефолтное значение

FastAPI: query-параметры

from fastapi import FastAPI, Query
from typing import Optional

app = FastAPI()

@app.get("/posts")
async def get_posts(
    page: int = Query(1, ge=1),
    limit: int = Query(20, ge=1, le=100),
    status: str = Query("published"),
    tags: list[str] = Query(None),  # Несколько значений
):
    # FastAPI автоматически парсит параметры с валидацией
    return {
        "page": page,
        "limit": limit,
        "status": status,
        "tags": tags or [],
    }

Query() детали:

  • ge=1 — Greater than or Equal (минимальное значение)
  • le=100 — Less than or Equal (максимальное значение)
  • Автоматическая валидация типов и ограничений
  • Документация в Swagger автоматическая

Flask: работа с параметрами

from flask import Flask, request

app = Flask(__name__)

@app.route("/api/posts")
def posts():
    page = request.args.get("page", 1, type=int)
    limit = request.args.get("limit", 20, type=int)
    tags = request.args.getlist("tags")  # Список значений
    
    return {"page": page, "limit": limit, "tags": tags}

Лучшие практики

Валидация:

  • Всегда проверяй типы и ограничения
  • Устанавливай дефолтные значения
  • Возвращай ошибку 400 для невалидных параметров

Безопасность:

  • Никогда не доверяй входным данным
  • Используй параметризованные запросы к БД
  • Экранируй данные в HTML

Производительность:

  • Ограничивай максимальный размер страницы (limit)
  • Кэшируй результаты с одинаковыми параметрами
  • Использование индексов в БД для часто фильтруемых полей

Query-параметры — стандартный способ передачи фильтров и опций в RESTful API и веб-приложениях.