使用python的Flask实现一个简单RESTful API服务器端

找了一篇教程学习了一下,为了加深印象照着写了一遍存下来,原文链接如下:传送门

REST的六个特性

  • Client-Server:服务器端与客户端分离。
  • Stateless(无状态):每次客户端请求必需包含完整的信息,换句话说,每一次请求都是独立的。
  • Cacheable(可缓存):服务器端必需指定哪些请求是可以缓存的。
  • Layered System(分层结构):服务器端与客户端通讯必需标准化,服务器的变更并不会影响客户端。
  • Uniform Interface(统一接口):客户端与服务器端的通讯方法必需是统一的。
  • Code on demand(按需执行代码?):服务器端可以在上下文中执行代码或者脚本?

HTTP请求方法

  1. GET 请求指定的页面信息,并返回实体主体。
  2. HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
  3. POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
  4. PUT 从客户端向服务器传送的数据取代指定的文档的内容。
  5. DELETE 请求服务器删除指定的页面。
  6. CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
  7. OPTIONS 允许客户端查看服务器的性能。
  8. TRACE 回显服务器收到的请求,主要用于测试或诊断。

规划资源的URL

GET http://[hostname]/todo/api/v1.0/tasks 检索任务清单
GET http://[hostname]/todo/api/v1.0/tasks/[task_id] 检索一个任务
POST http://[hostname]/todo/api/v1.0/tasks 创建一个新任务
PUT http://[hostname]/todo/api/v1.0/tasks/[task_id] 更新一个已存在的任务
DELETE http://[hostname]/todo/api/v1.0/tasks/[task_id] 删除一个任务

我们定义任务清单有以下字段:
id:唯一标识。整型。
title:简短的任务描述。字符串型。
description:完整的任务描述。文本型。
done:任务完成状态。布尔值型。

代码实现以及注释

#!flask/bin/python
# -*- coding:UTF-8 -*-
from flask import Flask, jsonify
from flask import make_response
from flask import request
from flask import abort

app = Flask(__name__)

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
    }
]


@app.route('/todo/api/v1.0/tasks', methods=['GET'])
def get_tasks():
    return jsonify({'tasks': tasks})


#通过参数,检索tasks数组。如果参数传过来的id不存在于数组内,我们需要返回错误代码404
#按照HTTP的规定,404意味着是"Resource Not Found",资源未找到。
#如果找到任务在内存数组内,我们通过jsonify模块将字典打包成JSON格式
#并发送响应到客户端上。就像处理一个实体字典一样。
@app.route('/todo/api/v1.0/tasks/<int:task_id>', methods=['GET'])
def get_task(task_id):
    task = filter(lambda t: t['id'] == task_id, tasks)
    if len(task) == 0:
        abort(404)
    return jsonify({'task':task[0]})

#使用post方法插入一个新的任务到数组中
@app.route('/todo/api/v1.0/tasks', methods=['POST'])
def create_task():
    #request.jason里面包含请求数据,如果不是JSON或者里面没有包含title字段
    if not request.json or not 'title' in request.json:
        abort(400)
    task = {
        'id': tasks[-1]['id'] + 1, #task[-1]代表原来的最后一位
        'title': request.json['title'],
        'description': request.json.get('description', ""),
        'done': False
    }
    tasks.append(task)
    return jsonify({'task': task}), 201

@app.errorhandler(404)
def not_found(error):
    return make_response(jsonify({'error': 'Not found'}), 404)

#更改数据
@app.route('/todo/api/v1.0/tasks/<int:task_id>', methods=['PUT'])
def update_task(task_id):
    task = filter(lambda t: t['id'] == task_id, tasks)
    if len(task) == 0:
        abort(404)
    if not request.json:
        abort(400)
    if 'title' in request.json and type(request.json['title']) != unicode:
        abort(400)
    if 'description' in request.json and type(request.json['description']) is not unicode:
        abort(400)
    if 'done' in request.json and type(request.json['done']) is not bool:
        abort(400)
    task[0]['title'] = request.json.get('title', task[0]['title'])
    task[0]['description'] = request.json.get('description', task[0]['description'])
    task[0]['done'] = request.json.get('done', task[0]['done'])
    return jsonify({'task': task[0]})

#删除数据
@app.route('/todo/api/v1.0/tasks/<int:task_id>', methods=['DELETE'])
def delete_task(task_id):
    task = filter(lambda t: t['id'] == task_id, tasks)
    if len(task) == 0:
        abort(404)
    tasks.remove(task[0])
    return jsonify({'result': True})

if __name__ == '__main__':
    app.run(debug=True)
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的前后端分离的项目示例,使用 Python Flask 框架和 Vue.js 前端框架。 1. 环境配置 首先,需要安装 Python 3 和 Node.js。 然后,使用以下命令安装 Flask 和相关扩展: ``` pip install flask flask-cors flask-restful ``` 2. 后端开发 在项目根目录下创建 `app.py` 文件,编写以下代码: ```python from flask import Flask, jsonify from flask_cors import CORS from flask_restful import Api, Resource app = Flask(__name__) api = Api(app) CORS(app) class HelloWorld(Resource): def get(self): return jsonify({"message": "Hello, World!"}) api.add_resource(HelloWorld, "/api/hello") if __name__ == "__main__": app.run(debug=True) ``` 这个代码创建了一个 Flask 应用,同时使用 Flask-RESTful 扩展创建了一个 `/api/hello` 的 API,返回一个 JSON 格式的消息。 3. 前端开发 在项目根目录下,使用以下命令初始化一个 Vue.js 项目: ``` vue create frontend ``` 然后,进入 `frontend` 目录,使用以下命令安装 axios: ``` npm install axios --save ``` 接着,创建一个 `src/App.vue` 文件,编写以下代码: ```html <template> <div> <h1>{{ message }}</h1> </div> </template> <script> import axios from "axios"; export default { data() { return { message: "", }; }, mounted() { axios.get("http://localhost:5000/api/hello").then((res) => { this.message = res.data.message; }); }, }; </script> ``` 这个代码创建了一个 Vue.js 应用,通过 axios 发送 HTTP 请求到 Flask 后端,获取 `/api/hello` 的响应,并显示在页面上。 4. 运行项目 在项目根目录下,使用以下命令分别启动 Flask 和 Vue.js 服务器: ``` python app.py ``` ``` cd frontend npm run serve ``` 然后,打开浏览器,访问 `http://localhost:8080`,即可看到页面上显示的消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值