使用flask开发RESTful架构的api服务器端(3)–简单的RESTful services

web开发

浏览数:885

2018-2-28

上一章中已经介绍了如何安装和使用flask,下面开始搭建一个RESTful架构的services了,RESTful架构在第一章中就已经进行了介绍,简单的说我们要用HTTP的4个方法来操作我们的服务器资源,这章的任务就是上flask创建4个HTTP方法的动作,这里使用学生信息库为用例;

学生信息资源为:

资源名称 资源类型
学生号 int
姓名 str
年龄 int
籍贯 str
平均分 float

第一步先将数据保存在内存中,使用数据库进行信息存储在之后章节再继续介绍;
1、创建flask服务器
首先与第二章的用例相同创建一个flask的服务器:

          
form flask import Flask

app = Flask(__name__)

@app.route('/')
def welcome():
    return "Welcome to studement management system!"

app.run(host="192.168.1.1", post=1234, debug=True)

这样就在192.168.1.1的1234端口上开启了监听服务器了,此时服务端只对’/’请求有响应,其它路径的响应都会返回404错误码;
2、POST:上传信息
HTTP4个方法的第一个是POST,通常用来上传信息:

          
from flask import jsonify
from flask import request

students = []

@app.route('/student/', methods=['POST'])
def add_student():
    if not request.json or not 'id' in request.json or not 'name' in request.json or not 'age' int request.json or not 'birthplace' in request.json or not 'grade' in request.json:
        abort(400)
    student = {
        'id' : request.json['id'],
        'name' : request.json['name'],
        'age' : request.json.get('age', ""),
        'birthplace' : request.json.get('birthplace', ""),
        'grade' : request.json['grade']
    }
    students.append(student)
    return "success"

使用flask的request方法可以很方便的得到请求数据,使用json来进行数据传输也是非常好用的方法,使用curl命令来进行测试:

        
curl -i -H "Content-Type: application/json" -X POST 'http://192.168.1.1:1234/student' \
        -d \
‘{ \
    “id”:1312441, \
    "name":"lucy", \
    "birthplace":"beijin", \
    "age":20, \
    "grade":90
}’

注意需要将Content-Type设置为json flask的request模块才会对请求数据部分做json格式得解析;
如果返回200状态码并回复success,则数据添加成功;
3、PUT:更新信息
PUT方法通常用来进行数据的更新,相应的curl命令为:

         
curl -i -H "Content-Type: application/json" -X PUT 'http://192.168.1.1:1234/student?id=1312441' \
        -d \
‘{ \
    "birthplace":"beijin", \
    "age":20, \
    "grade":90
}’

以uri中参数的数值作为key,查找需要修改的信息条目,服务端代码为:

         
from flask import jsonify
from flask import request
from flask import make_response

students = []

@app.route('/students', methods = 'PUT')
def update_students():
    if not request.args or not 'id' in request.args:
        abort(400)
    update_id = request.args['id']
    update_id = int(update_id)
    student = filter(lambda t: t['id'] == update_id, students)
    if len(student) == 0:
        abort(400)
    if not request.json:
        abort(403)

    student[0]['name'] = request.json.get('name', student[0]['name'])
    student[0]['age'] = request.json.get('age', student[0]['age'])
    student[0]['grade'] = request.json.get('grade', student[0]['grade'])
    student[0]['birthplace'] = request.json.get('birthplace', student[0]['birthplace'])

    return jsonify({student:student[0]})

如果找不到指定id的学生就会返回400错误,如果修改成功则返回修改后的学生信息;
4、DELETE:删除指定信息
使用DELETE来删除指定的学生信息,相应的请求信息为:

      
curl -X DELETE 'http://192.168.1.1:1234/student?id=1312441'

服务端处理代码为

           
from flask import jsonify
from flask import request
from flask import make_response

students = []

@app.route('/students', methods = 'DELETE')
def delete_students():
    if not request.args:
        abort(400)
    if 'id' in request.args:
        d_id = request.args['id']
        d_id = int(d_id)
        student = filter(lambda t: t['id'] == d_id, students)
        if len(student) == 0:
            abort(400)
        students.remove(student[0])

    return "success"

5、GET:获取信息
使用GET方法获取学生信息,相应请求信息为:

        
curl -X GET 'http://192.168.1.1:1234/student?id=1312441'

服务端处理代码为:

         
from flask import jsonify
from flask import request
from flask import make_response

students = []

@app.route('/students', methods = 'GET')
def delete_students():
    if not request.args:
        abort(400)
    get_id = request.args['id']
    get_id = int(get_id)
    student = filter(lambda t: t['id'] == get_id, students)
    if len(student) == 0:
        abort(400)
    return jsonify({'student':student[0]})

实现了4个方法后,一个简单的web服务器就成型了。更复杂的功能可以在此基础上继续加强,下一章将介绍如何使用flask+数据库来存取数据;
← 使用flask开发RESTful架构的api服务器端(2)–flask的安装和使用
使用flask开发RESTful架构的api服务器端(4)–flask操作数据库 →
http://www.mrhaoting.com/?p=184