昨天还是差不多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:
基本测试完毕,现在就差实际开发了