4.1 KiB
4.1 KiB
Static2API
A simple FastAPI application that automatically exposes CSV and JSON files as API endpoints.
Features
- Automatically creates API endpoints for CSV and JSON files in the
source
directory - Files are accessible via
/api/{filename}
endpoints - New files are detected automatically without restarting the server
- Runs in a secure container with Docker or Podman
Quick Start
Option 1: Run with Python
# Install dependencies
pip install -r requirements.txt
# Run the application
uvicorn main:app --reload
The API will be available at: http://localhost:8000
Option 2: Run with Docker/Podman
Use the provided script to run the application in a container:
# Make the script executable
chmod +x run_container.sh
# Run the container
./run_container.sh
The API will be available at: http://localhost:8000
API Endpoints
GET /
- Welcome messageGET /api/{filename}
- Access data from files in the source directory
Example:
GET /api/contacts
- Returns data fromsource/contacts.csv
GET /api/users
- Returns data fromsource/users.json
Sample Responses
CSV Example (from contacts.csv)
curl http://localhost:8000/api/contacts
Response:
[
{
"location": "dortmund",
"contact": "achim"
},
{
"location": "madrid",
"contact": "santos"
}
]
JSON Example (from users.json)
curl http://localhost:8000/api/users
Response:
{
"users": [
{
"name": "John",
"email": "john@example.com"
},
{
"name": "Jane",
"email": "jane@example.com"
}
]
}
Adding New Files
- Place CSV or JSON files in the
source
directory - Files will be automatically accessible via
/api/{filename}
- No restart required
File Format Support
- CSV files: Must have a header row with column names
- JSON files: Must contain valid JSON data
Using the API in External Applications
Python Example
Here's how to consume the API data in a Python script:
import requests
import pandas as pd
from pprint import pprint
# Base URL of the API
API_BASE_URL = 'http://localhost:8000'
# Example 1: Get users data
response = requests.get(f"{API_BASE_URL}/api/users")
users_data = response.json()
pprint(users_data)
# Example 2: Get contacts and convert to DataFrame
response = requests.get(f"{API_BASE_URL}/api/contacts")
contacts_data = response.json()
contacts_df = pd.DataFrame(contacts_data)
print(contacts_df)
# Example 3: Extract specific information
contacts_response = requests.get(f"{API_BASE_URL}/api/contacts")
contacts = contacts_response.json()
locations = [contact['location'] for contact in contacts]
print(f"Available locations: {locations}")
# Example 4: Filtering data
users_response = requests.get(f"{API_BASE_URL}/api/users")
users_data = users_response.json()
filtered_users = [user for user in users_data.get('users', [])
if user.get('name') == 'John']
print(f"Filtered users: {filtered_users}")
Output:
{'users': [{'name': 'John', 'email': 'john@example.com'},
{'name': 'Jane', 'email': 'jane@example.com'}]}
location contact
0 dortmund achim
1 madrid santos
Available locations: ['dortmund', 'madrid']
Filtered users: [{'name': 'John', 'email': 'john@example.com'}]
Manual Container Setup
Docker
# Build the image
docker build -t static2api:latest .
# Run the container
docker run --name static2api \
-p 8000:8000 \
-v "./source":/home/appuser/app/source \
--security-opt no-new-privileges:true \
--cap-drop ALL \
--user 1000:1000 \
-d static2api:latest
Podman
# Build the image
podman build -t static2api:latest .
# Run the container
podman run --name static2api \
-p 8000:8000 \
-v "./source":/home/appuser/app/source:Z \
--security-opt no-new-privileges:true \
--cap-drop ALL \
--user 1000:1000 \
-d static2api:latest
Container Management
View Logs
docker logs static2api
# or
podman logs static2api
Stop Container
docker stop static2api
# or
podman stop static2api
Remove Container
docker rm static2api
# or
podman rm static2api