昨天还是差不多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方法:
可以看到数据的正确输出
测试下post方法:
:),用了全蛋哥的名字了
使用错误的token:
基本测试完毕,现在就差实际开发了