#sora#实验2

#sora#实验2_第1张图片

昨天还是差不多12点半才睡,今天下午回去上自修肯定会困。。。


稍微试了下把flask应用中的类写在不同的python文件中。


实验目的:把flask应用中的类写成独立的模块,避免在主程序中写太多的class

源码:

flaskrr.py:

__author__ = 'hochikong'
from flask import Flask,request
from flask.ext.restful import Resource,Api,reqparse
from users import Users


app = Flask(__name__)
api = Api(app)

todos = {'task':'get the list of docker'}

parser = reqparse.RequestParser()
parser.add_argument('name',type=str,help='get the name')
parser.add_argument('auth-token',type=str,help='put the token here',location='headers')


class TodoSimple(Resource):
    def get(self,todo_id):
        args = parser.parse_args()
        if args['auth-token'] == 'thisismytoken':
            return {todo_id:todos[todo_id]}
        else:
            return {'error':'token error'},401

    def put(self,todo_id):
        args = parser.parse_args()
        if args['auth-token'] == 'thisismytoken':
            todos[todo_id] = request.json.get('data')
            return todos,201
        else:
            return {'status':'error'},401



class GetName(Resource):
    def post(self):
        args = parser.parse_args()
        name = args['name']
        #name = {}
        #name['ac'] = args['name']
        #name = request.json.get('name')
        return {'yourame':name}



api.add_resource(TodoSimple,'/todo/<string:todo_id>')
api.add_resource(GetName,'/getname')
api.add_resource(Users,'/users/','/users/<string:user_id>')

if __name__ == '__main__':
    app.run(debug=True)


users.py:

__author__ = 'hochikong'
from flask import request
from flask.ext.restful import Resource,reqparse

parser = reqparse.RequestParser()
parser.add_argument('auth-token',type=str,help='put the token here',location='headers')

class Users(Resource):
    users = {"admin":"hochikong"}
    def get(self):
        args = parser.parse_args()
        if args['auth-token'] == 'thisismytoken':
            return self.users
        else:
            return {"status":"error","reason":"token error"}

    def post(self,user_id):
        args = parser.parse_args()
        if args['auth-token'] == 'thisismytoken':
            self.users[user_id] = request.json.get('username')
            return self.users
        else:
            return {"status":"error","reason":"token error"}


测试的是users.py中的Users类,实现了get和post方法,可以创建或查询用户

设计要求:避免把所有类写在主程序里,代码模块化,提高可读性


代码分析:

每个独立的模块,应该导入并继承flask-restful的Resource类:

from flask.ext.restful import Resource,reqparse
class Users(Resource):

当方法中存在需要reqparse处理的参数,你也要导入reqparse和定义解析参数:

parser = reqparse.RequestParser()
parser.add_argument('auth-token',type=str,help='put the token here',location='headers')

在这里解析发送来的json文档是直接依靠request.json.get()解析的:

self.users[user_id] = request.json.get('username')

在这个例子中,用户数据只是保存在内存中,在sora的实际开发中,还得用sqlalchemy处理。

要使用这个类,只要在主程序中import User类,并添加为资源即可:

from users import Users
api.add_resource(Users,'/users/','/users/<string:user_id>')

这里为Users资源配置了多个url,/users是使用GET获取用户信息时访问的url,而加了user_id变量的是用于创建新的用户。


测试过程:

自然要先启动flaskrr.py

用昨天安装的REST client测试:

先测试get方法:

#sora#实验2_第2张图片

可以看到数据的正确输出


测试下post方法:

#sora#实验2_第3张图片

:),用了全蛋哥的名字了


使用错误的token:

#sora#实验2_第4张图片


基本测试完毕,现在就差实际开发了

你可能感兴趣的:(flask)