以下是详细的攻略:
1. 确定需求 & 设计接口
在部署RESTful API服务之前,我们需要先确保实现的功能和设计的API接口符合需求。
在本案例中,我们设定了两个API接口:
- /todolist/api/v1.0/tasks:获取所有任务(GET);添加新任务(POST)。
- /todolist/api/v1.0/tasks/:task_id:获取某个具体任务(GET);更新某个具体任务(PUT);删除某个具体任务(DELETE)。
接口设计:
请求方式 | URL | 功能 |
---|---|---|
GET | /todolist/api/v1.0/tasks | 获取所有任务 |
POST | /todolist/api/v1.0/tasks | 添加新任务 |
GET | /todolist/api/v1.0/tasks/:task_id | 获取某个具体任务 |
PUT | /todolist/api/v1.0/tasks/:task_id | 更新某个具体任务 |
DELETE | /todolist/api/v1.0/tasks/:task_id | 删除某个具体任务 |
2. 安装 Flask & 创建项目文件夹
接下来,我们开始创建Flask项目。在开始之前,需要提前安装好 Flask。
使用如下命令在终端安装Flask:
pip install Flask
在安装完Flask后,我们创建一个文件夹来存放我们的项目,可以在终端中运行如下命令:
mkdir todolist
cd todolist
3. 创建项目结构
在项目文件夹中,我们需要创建如下文件夹和文件:
todolist/
|—— app.py
|—— requirements.txt
|—— api/
| |—— __init__.py
| |—— tasks.py
- app.py: 项目启动文件,我们将在这个文件中编写整个应用的设置和路由。
- requirements.txt:描述项目所需的依赖项,我们在本案例中需要安装Flask和Flask-RESTful。
- api/init.py:初始化Python模块,在这个文件中我们将初始化Flask-RESTful API并将其绑定到Flask应用程序。
- api/tasks.py:包含所有涉及任务的功能函数和路由处理程序。
4. 编写 API
4.1 编写 /todolist/api/v1.0/tasks GET 方法
我们现在需要将我们的API路由添加到应用程序中。首先,我们编写/tasks路由的GET方法来检索所有任务。在/api/tasks.py文件中,我们添加以下方法:
from flask_restful import Resource
tasks = [
{
'id': 1,
'title': u'Buy groceries',
'description': u'Milk, Cheese, Pizza, Fruit, Tylenol',
'done': False
},
{
'id': 2,
'title': u'Learn Python',
'description': u'Need to find a good Python tutorial on the web',
'done': False
}
]
class TaskList(Resource):
def get(self):
return {'tasks': tasks}
这个方法返回已经存储在tasks列表中的一些样本数据。
我们现在已经在/api/tasks.py文件中定义了TaskList类,因此我们可以在此处初始化API:
from flask_restful import Api
from api.tasks import TaskList
app = Flask(__name__)
api = Api(app)
api.add_resource(TaskList, '/todolist/api/v1.0/tasks')
这里,我们已经将TaskList添加到API中,因此它已经绑定到路由/todolist/api/v1.0/tasks。
4.2 编写 /todolist/api/v1.0/tasks POST 方法
我们将使用POST方法来向/tasks路由添加新任务数据。
在/api/tasks.py文件中,我们现在将定义Task新类并将其添加到API中:
from flask import request
from flask_restful import Resource
tasks = [
{
'id': 1,
'title': u'Buy groceries',
'description': u'Milk, Cheese, Pizza, Fruit, Tylenol',
'done': False
},
{
'id': 2,
'title': u'Learn Python',
'description': u'Need to find a good Python tutorial on the web',
'done': False
}
]
class TaskList(Resource):
def get(self):
return {'tasks': tasks}
def post(self):
task = {
'id': tasks[-1]['id'] + 1,
'title': request.json['title'],
'description': request.json.get('description', ""),
'done': False
}
tasks.append(task)
return task, 201
函数post()将从传递到/tasks接口的POST请求中读取任务数据并将其添加到tasks列表中。我们caller通过代码request.json来使用POST请求中的JSON数据.
4.3 编写 /todolist/api/v1.0/tasks/:task_id GET 方法
首先,我们要获取某个具体任务,我们需要查询列表中的任务,找到相应的任务并返回它。由于任务id是我们唯一的索引字符串,我们可以使用它来查询特定任务。
在/api/tasks.py文件中,我们将添加GET方法来查询具有特定id的特定任务:
from flask import abort
from flask_restful import Resource
class Task(Resource):
def get(self, task_id):
task = [task for task in tasks if task['id'] == task_id]
if len(task) == 0:
abort(404)
return {'task': task[0]}
这里代码我们使用了Python for循环跟if语句,并使用Flask的abort()函数返回404错误码。
我们现在可以将新的resource类添加到API中:
from api.tasks import TaskList, Task
api.add_resource(TaskList, '/todolist/api/v1.0/tasks')
api.add_resource(Task, '/todolist/api/v1.0/tasks/<int:task_id>')
4.4 编写 /todolist/api/v1.0/tasks/:task_id PUT 方法
PUT方法使用于更新任务。我们将使用PUT方法修正某个具体任务的信息,这些信息可以传递到/tasks/
在/api/tasks.py文件中,我们现在添加PUT方法来修改具有特定id的特定任务:
class Task(Resource):
def get(self, task_id):
task = [task for task in tasks if task['id'] == task_id]
if len(task) == 0:
abort(404)
return {'task': task[0]}
def put(self, task_id):
task = [task for task in tasks if task['id'] == task_id]
if len(task) == 0:
abort(404)
task = task[0]
task['title'] = request.json.get('title', task['title'])
task['description'] = request.json.get('description', task['description'])
task['done'] = request.json.get('done', task['done'])
return task
请求中的新任务数据将覆盖现有的任务字段。
4.5 编写 /todolist/api/v1.0/tasks/:task_id DELETE 方法
最后,我们需要实现删除任务。这将从/tasks路由中的特定任务ID删除任务。
在/api/tasks.py文件中,我们现在将定义DELETE方法来删除具有特定id的特定任务:
class Task(Resource):
def get(self, task_id):
task = [task for task in tasks if task['id'] == task_id]
if len(task) == 0:
abort(404)
return {'task': task[0]}
def put(self, task_id):
task = [task for task in tasks if task['id'] == task_id]
if len(task) == 0:
abort(404)
task = task[0]
task['title'] = request.json.get('title', task['title'])
task['description'] = request.json.get('description', task['description'])
task['done'] = request.json.get('done', task['done'])
return task
def delete(self, task_id):
task = [task for task in tasks if task['id'] == task_id]
if len(task) == 0:
abort(404)
tasks.remove(task[0])
return {'result': True}
5. 部署应用程序
接下来,我们要部署应用程序。
首先,我们需要创建和初始化Python虚拟环境。
python -m venv venv
venv/Scripts/activate
我们需要使用requirements.txt安装Flask和Flask-RESTful依赖项。请确保已转到包含requirements.txt的目录。输入以下命令:
pip install -r requirements.txt
现在,启动应用程序:
python app.py
你应该能够在浏览器中打开http://127.0.0.1:5000/todolist/api/v1.0/tasks并看到所有任务。
示例一
我们现在将使用python-requests库进行测试,以测试我们刚刚部署的应用程序。这个示例中,我们将添加一些新的任务并获取任务列表 -
import requests
# Add New Task
response = requests.post('http://localhost:5000/todolist/api/v1.0/tasks', json={'title': 'Read a book'})
print(response.status_code, response.json())
# Get All Tasks
response = requests.get('http://localhost:5000/todolist/api/v1.0/tasks')
print(response.status_code, response.json())
输出结果:
201 {'description': '', 'done': False, 'id': 3, 'title': 'Read a book'}
200 {'tasks': [{'description': 'Milk, Cheese, Pizza, Fruit, Tylenol', 'done': False, 'id': 1, 'title': 'Buy groceries'}, {'description': 'Need to find a good Python tutorial on the web', 'done': False, 'id': 2, 'title': 'Learn Python'}, {'description': '', 'done': False, 'id': 3, 'title': 'Read a book'}]}
我们的新任务已成功添加在列表中。
示例二
我们现在将调用API中的其他方法,比如删除任务和更新任务。
import requests
# Add New Task
response = requests.post('http://localhost:5000/todolist/api/v1.0/tasks', json={'title': 'Read a book'})
# Delete Task
response = requests.delete('http://localhost:5000/todolist/api/v1.0/tasks/3')
print(response.status_code)
# Get All Tasks After Delete
response = requests.get('http://localhost:5000/todolist/api/v1.0/tasks')
print(response.status_code, response.json())
# Update Task
response = requests.put('http://localhost:5000/todolist/api/v1.0/tasks/2', json={'title': 'Learn Flask'})
print(response.status_code, response.json())
# Get Specific Task
response = requests.get('http://localhost:5000/todolist/api/v1.0/tasks/2')
print(response.status_code, response.json())
输出结果:
204
200 {'tasks': [{'description': 'Milk, Cheese, Pizza, Fruit, Tylenol', 'done': False, 'id': 1, 'title': 'Buy groceries'}, {'description': 'Need to find a good Python tutorial on the web', 'done': False, 'id': 2, 'title': 'Learn Python'}]}
200 {'description': 'Need to find a good Python tutorial on the web', 'done': False, 'id': 2, 'title': 'Learn Flask'}
200 {'task': {'description': 'Need to find a good Python tutorial on the web', 'done': False, 'id': 2, 'title': 'Learn Flask'}}
在这个示例中,我们成功地调用了API的其他方法,如DELETE,PUT和GET。
这样,我们就成功地创建了一个使用Python和Flask框架实现RESTful Web API的应用程序,并成功地测试完涉及到的API方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用Python & Flask 实现RESTful Web API的实例 - Python技术站