215 lines
No EOL
4.1 KiB
Markdown
215 lines
No EOL
4.1 KiB
Markdown
# 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
|
|
|
|
```bash
|
|
# 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:
|
|
|
|
```bash
|
|
# 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 message
|
|
- `GET /api/{filename}` - Access data from files in the source directory
|
|
|
|
Example:
|
|
- `GET /api/contacts` - Returns data from `source/contacts.csv`
|
|
- `GET /api/users` - Returns data from `source/users.json`
|
|
|
|
## Sample Responses
|
|
|
|
### CSV Example (from contacts.csv)
|
|
|
|
```bash
|
|
curl http://localhost:8000/api/contacts
|
|
```
|
|
|
|
Response:
|
|
```json
|
|
[
|
|
{
|
|
"location": "dortmund",
|
|
"contact": "achim"
|
|
},
|
|
{
|
|
"location": "madrid",
|
|
"contact": "santos"
|
|
}
|
|
]
|
|
```
|
|
|
|
### JSON Example (from users.json)
|
|
|
|
```bash
|
|
curl http://localhost:8000/api/users
|
|
```
|
|
|
|
Response:
|
|
```json
|
|
{
|
|
"users": [
|
|
{
|
|
"name": "John",
|
|
"email": "john@example.com"
|
|
},
|
|
{
|
|
"name": "Jane",
|
|
"email": "jane@example.com"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
## Adding New Files
|
|
|
|
1. Place CSV or JSON files in the `source` directory
|
|
2. Files will be automatically accessible via `/api/{filename}`
|
|
3. 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:
|
|
|
|
```python
|
|
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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
docker logs static2api
|
|
# or
|
|
podman logs static2api
|
|
```
|
|
|
|
### Stop Container
|
|
|
|
```bash
|
|
docker stop static2api
|
|
# or
|
|
podman stop static2api
|
|
```
|
|
|
|
### Remove Container
|
|
|
|
```bash
|
|
docker rm static2api
|
|
# or
|
|
podman rm static2api
|
|
``` |