✨ api
This commit is contained in:
32
README.md
32
README.md
@@ -224,6 +224,38 @@ For larger comic archives, consider replacing the `COMICS` list with a database:
|
|||||||
- `/about` - About the comic and author
|
- `/about` - About the comic and author
|
||||||
- `/static/feed.rss` - RSS feed
|
- `/static/feed.rss` - RSS feed
|
||||||
|
|
||||||
|
## API Endpoints
|
||||||
|
|
||||||
|
The app exposes a JSON API for programmatic access:
|
||||||
|
|
||||||
|
- **GET `/api/comics`** - Returns all comics as a JSON array
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"number": 1,
|
||||||
|
"title": "First Comic",
|
||||||
|
"filename": "comic-001.png",
|
||||||
|
"date": "2025-01-01",
|
||||||
|
"alt_text": "The very first comic",
|
||||||
|
"author_note": "This is where your comic journey begins!"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
- **GET `/api/comics/<id>`** - Returns a specific comic as JSON
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"number": 1,
|
||||||
|
"title": "First Comic",
|
||||||
|
"filename": "comic-001.png",
|
||||||
|
"date": "2025-01-01",
|
||||||
|
"alt_text": "The very first comic",
|
||||||
|
"author_note": "This is where your comic journey begins!"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Returns 404 with `{"error": "Comic not found"}` if the comic doesn't exist.
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
[Add your license here]
|
[Add your license here]
|
||||||
|
|||||||
21
app.py
21
app.py
@@ -1,5 +1,5 @@
|
|||||||
import os
|
import os
|
||||||
from flask import Flask, render_template, abort
|
from flask import Flask, render_template, abort, jsonify, request
|
||||||
from comics_data import COMICS
|
from comics_data import COMICS
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
@@ -59,9 +59,28 @@ def about():
|
|||||||
return render_template('about.html', title='About')
|
return render_template('about.html', title='About')
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/api/comics')
|
||||||
|
def api_comics():
|
||||||
|
"""API endpoint - returns all comics as JSON"""
|
||||||
|
return jsonify(COMICS)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/api/comics/<int:comic_id>')
|
||||||
|
def api_comic(comic_id):
|
||||||
|
"""API endpoint - returns a specific comic as JSON"""
|
||||||
|
comic = get_comic_by_number(comic_id)
|
||||||
|
if not comic:
|
||||||
|
return jsonify({'error': 'Comic not found'}), 404
|
||||||
|
return jsonify(comic)
|
||||||
|
|
||||||
|
|
||||||
@app.errorhandler(404)
|
@app.errorhandler(404)
|
||||||
def page_not_found(e):
|
def page_not_found(e):
|
||||||
"""404 error handler"""
|
"""404 error handler"""
|
||||||
|
# Return JSON for API requests
|
||||||
|
if request.path.startswith('/api/'):
|
||||||
|
return jsonify({'error': 'Not found'}), 404
|
||||||
|
# Return HTML for regular pages
|
||||||
return render_template('404.html', title='Page Not Found'), 404
|
return render_template('404.html', title='Page Not Found'), 404
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user