I. What is Flask and RESTful API?¶
Flask is a lightweight Python Web framework known for its simplicity and flexibility, making it ideal for quickly developing small web applications and APIs. On the other hand, RESTful API (Representational State Transfer) is a software architectural style for building scalable and maintainable web services. It is designed around the HTTP protocol, enabling data CRUD operations through resources (e.g., users, products) and HTTP methods (GET/POST/PUT/DELETE).
II. Installing Flask¶
Before starting, ensure you have a Python environment installed. Install Flask using pip:
pip install flask
III. First Flask API: Hello World¶
Create a simple API endpoint that returns “Hello, Flask!”:
from flask import Flask, jsonify
# Initialize Flask application
app = Flask(__name__)
# Define route: Accessing /hello returns "Hello, Flask!"
@app.route('/hello', methods=['GET'])
def hello():
return jsonify(message="Hello, Flask!") # Return JSON-formatted data
# Run the application (only when executed directly)
if __name__ == '__main__':
app.run(debug=True) # debug=True enables auto-reload on code changes
Testing the API: Execute the script with python app.py, then visit http://localhost:5000/hello in a browser or Postman to see the result.
IV. RESTful Style Fundamentals: Resources and HTTP Methods¶
The core of RESTful APIs lies in “resources” and “HTTP methods”. Keep these principles in mind:
- Resource Naming: Use nouns to represent resources (e.g.,
/todosfor “todo list collection”,/todos/1for a single todo item). - HTTP Methods for Operations:
GET: Retrieve resources (read operation).POST: Create new resources (write operation).PUT: Update resources (full update).DELETE: Remove resources (delete operation).- Status Codes: Return appropriate status codes to indicate operation results (e.g., 200=success, 201=created, 404=resource not found).
V. Practical Example: Building a Todo API¶
Let’s implement a complete RESTful API for a “Todo” application with CRUD functionality.
1. Initialize Mock Data¶
Use an in-memory list to simulate a database for storing todos:
from flask import Flask, jsonify, request
app = Flask(__name__)
todos = [] # Mock database: stores todo dictionaries
next_id = 1 # Auto-incrementing todo ID
2. Create Resource Collection: GET/POST Todos¶
Handle the entire todo collection (/todos):
- GET /todos: Retrieve all todos.
- POST /todos: Add a new todo.
@app.route('/todos', methods=['GET', 'POST'])
def todos():
if request.method == 'GET':
# GET: Return all todos
return jsonify(todos)
elif request.method == 'POST':
# POST: Create a new todo from request data
global next_id
new_todo = {
'id': next_id,
'content': request.json.get('content', 'No content provided'), # Extract JSON input
'done': False # Default to incomplete
}
todos.append(new_todo)
next_id += 1
return jsonify(new_todo), 201 # 201 = Created successfully
3. Single Resource Operations: GET/PUT/DELETE¶
Handle individual todos by ID (e.g., /todos/1):
@app.route('/todos/<int:todo_id>', methods=['GET', 'PUT', 'DELETE'])
def single_todo(todo_id):
# Find the target todo by ID
todo = next((t for t in todos if t['id'] == todo_id), None)
if not todo:
return jsonify(error="Todo not found"), 404 # 404 = Resource not found
if request.method == 'GET':
return jsonify(todo) # Return a single todo
elif request.method == 'PUT':
# PUT: Full update of a todo
todo['content'] = request.json.get('content', todo['content'])
todo['done'] = request.json.get('done', todo['done'])
return jsonify(todo)
elif request.method == 'DELETE':
# DELETE: Remove the todo
todos.remove(todo)
return jsonify(message="Todo deleted successfully"), 200 # 200 = Success
VI. Testing the API¶
Use Postman or curl to test the endpoints. Below are common commands:
- Get All Todos:
curl http://localhost:5000/todos
- Create a New Todo:
curl -X POST -H "Content-Type: application/json" -d '{"content": "Learn Flask"}' http://localhost:5000/todos
- Get a Single Todo:
curl http://localhost:5000/todos/1
- Update a Todo:
curl -X PUT -H "Content-Type: application/json" -d '{"content": "Master Flask API"}' http://localhost:5000/todos/1
- Delete a Todo:
curl -X DELETE http://localhost:5000/todos/1
VII. Advanced Learning Directions¶
After mastering the basics, explore these topics to enhance your API development skills:
- Route Parameters and Type Conversion: Use
<int:user_id>to extract and convert parameters (e.g.,/users/<int:id>). - Request Data Validation: Validate inputs with libraries like
marshmalloworpydantic. - Database Integration: Connect to MySQL/PostgreSQL using SQLAlchemy for persistent storage.
- Authentication/Authorization: Implement JWT or session-based authentication for secure APIs.
VIII. Conclusion¶
Flask provides a robust foundation for building APIs, while RESTful principles ensure they are standardized and maintainable. Through the Todo API example, you’ve learned resource design, HTTP method usage, and core data handling. To expand, integrate databases and deployment tools (e.g., Gunicorn) for production-ready APIs.
Start practicing today! From simple endpoints to complex projects, gradually build your API development expertise.