Native HTTP QUERY method support for FastAPI with automatic cache control and Swagger compatibility.
Project description
FastAPI Extended Query Method
Native HTTP QUERY support for FastAPI.
Overview
FastAPIWithQueryHttpMethod extends FastAPI with native support for the
HTTP QUERY method while preserving the FastAPI developer experience.
Installation
pip install fastapi-extended-query-method
Quick Start
## main.py
import uuid
from typing import List, Optional
import uvicorn
from fastapi import Query
from fastapi.responses import JSONResponse
from pydantic import BaseModel
# 1. Initialize the app using your custom class
from fastapi_extended_query_method import FastAPIWithQueryHttpMethod
app = FastAPIWithQueryHttpMethod(query_saving_cache=True)
# 2. Mock Data for quick testing
MOCK_PRODUCTS = [
{"id": 1, "name": "Gaming Laptop", "category": "electronics", "price": 1200.99},
{"id": 2, "name": "Smartphone", "category": "electronics", "price": 599.99},
{"id": 3, "name": "Bluetooth Headphones", "category": "electronics", "price": 79.90},
{"id": 4, "name": "Espresso Machine", "category": "appliances", "price": 150.00},
{"id": 5, "name": "Blender", "category": "appliances", "price": 45.50},
{"id": 6, "name": "Office Chair", "category": "furniture", "price": 180.00},
]
# 3. Pydantic Schemas
from pydantic import BaseModel
# ---- [ES] MODELOS DE PYDANTIC (ENTRADA Y SALIDA) ----
# ---- [EN] PYDANTIC MODELS (INPUT AND OUTPUT) ----
class SearchFilters(BaseModel):
"""
[ES] Modelo de entrada para los filtros de búsqueda de productos.
[EN] Input model for product search filters.
"""
categories: list[str] = []
excluded_brands: list[str] = []
max_price: float = 10_000
min_price: float = 100
class ProductFormat(BaseModel):
"""
[ES] Modelo que define la estructura estándar de un producto.
[EN] Model defining the standard structure of a product.
"""
id: int
name: str
category: str
price: float
brand: str
class SearchResponse(BaseModel):
"""
[ES] Modelo de salida para la respuesta de la búsqueda.
[EN] Output model for the search response.
"""
status: str
total_found: int
products: list[ProductFormat]
# 4. Filter function simulating database queries with mock data
def get_products_from_sqlite(filters: SearchFilters, limit: int, order_by: str):
results = MOCK_PRODUCTS.copy()
# Apply search filters if they are provided
if filters.categories:
results = [p for p in results if p["category"].lower() in [c.lower() for c in filters.categories]]
if filters.min_price is not None:
results = [p for p in results if p["price"] >= filters.min_price]
if filters.max_price is not None:
results = [p for p in results if p["price"] <= filters.max_price]
# Sort results dynamically (defaults to "id")
results = sorted(results, key=lambda x: x.get(order_by, x["id"]))
# Apply limit
return results[:limit]
# 5. Endpoint using your custom @app.query decorator
@app.query("/products/filter", response_model=SearchResponse)
async def filter_products(
filters: SearchFilters,
limit: int = Query(default=10, ge=1),
order_by: str = "id",
):
print("----------------------------------------------------")
# Fetch and filter the mock data
filtered_products = get_products_from_sqlite(
filters=filters,
limit=limit,
order_by=order_by,
)
execution_id = str(uuid.uuid4())
return JSONResponse(
content={
"status": "success",
"execution_id": execution_id,
"total_found": len(filtered_products),
"products": filtered_products,
},
headers={
"X-Execution-Id": execution_id,
},
)
# 6. Mostrar las rutas registradas
@app.on_event("startup")
async def show_routes():
print("\n================== REGISTERED ROUTES ==================")
for route in app.routes:
methods = getattr(route, "methods", None)
print(
f"Path: {route.path}"
f"\nMethods: {methods}"
f"\nName: {route.name}"
f"\nOperation ID: {getattr(route, 'operation_id', None)}"
"\n------------------------------------------------------"
)
# 7. Direct startup block
if __name__ == "__main__":
uvicorn.run(
"main:app",
host="127.0.0.1",
port=8000,
reload=True,
)
Start Server
python main.py
Swagger compatibility
After starting the application:
http://localhost:8000/docs
OpenAPI and Swagger do not currently support the HTTP QUERY method.
For that reason this package automatically exposes QUERY endpoints as both:
- QUERY
- POST
Use the POST operation in Swagger only for interactive testing.
Real clients should invoke the QUERY method directly.
Cache
query_saving_cache=True allows caching.
query_saving_cache=False automatically adds:
- Cache-Control: no-store
- Pragma: no-cache
- Expires: 0
Testing API
python validate_data/test_api_query_method.py
Testing Cache
Using Cache Stored
python validate_data/test_cache_comparison.py
NO Using Cache Stored
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fastapi_extended_query_method-0.0.33.213.tar.gz.
File metadata
- Download URL: fastapi_extended_query_method-0.0.33.213.tar.gz
- Upload date:
- Size: 6.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d14d3037fbbb39958302dcdeba30d32afea909310c6d57b678c8a370c37ed2ff
|
|
| MD5 |
824609fc19039bbf6243a87b8ee8b82a
|
|
| BLAKE2b-256 |
289a3738bc38a23fed08a92a9a481e0320d0c11f545f91a568b1bc7d3767023f
|
File details
Details for the file fastapi_extended_query_method-0.0.33.213-py3-none-any.whl.
File metadata
- Download URL: fastapi_extended_query_method-0.0.33.213-py3-none-any.whl
- Upload date:
- Size: 6.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f8754e18e2f907509179d345bc41a50c71b9d97c85e6b482d370b377a4c8000e
|
|
| MD5 |
e5f74012b52a808adda3b5a5cdc72d75
|
|
| BLAKE2b-256 |
073b0f4fca81bf84054d8723f7fa88a299f8f15d434533da0880cfee999d9d26
|