您好,登錄后才能下訂單哦!
本篇文章為大家展示了如何在flask應(yīng)用中使用多個(gè)http頭并借助PUT實(shí)現(xiàn)POST提交數(shù)據(jù),內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
實(shí)驗(yàn)?zāi)康模涸趂lask應(yīng)用中使用多個(gè)http頭并借助PUT,POST提交數(shù)據(jù)
源代碼:
__author__ = 'hochikong' from flask import Flask,request from flask.ext.restful import Resource,Api,reqparse 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') if __name__ == '__main__': app.run(debug=True)
測(cè)試的核心是TodoSimple類(lèi),測(cè)試的是PUT方法
測(cè)試工具由單純的curl換成了firefox的REST client(話說(shuō),直接用curl我也真沒(méi)什么耐心去用),安裝firefox擴(kuò)展參考此:http://www.blogjava.net/paulwong/archive/2014/04/19/412688.html
設(shè)計(jì)要求:要在HTTP請(qǐng)求中,包含content-type:application/json和自定義的auth-token頭,另外請(qǐng)求體是一個(gè)json文檔,flask應(yīng)用應(yīng)該懂得處理其中的數(shù)據(jù)
代碼分析:
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
從我前一篇blog中,我知道可以用reqparse解析json數(shù)據(jù),在TodoSimple類(lèi)中,解析auth-token頭是使用reqparse進(jìn)行的,但我們要在前面定義該參數(shù):
parser.add_argument('auth-token',type=str,help='put the token here',location='headers')
如果我們不使用reqparse解析,我們可以用flask自帶的request模塊解析:
todos[todo_id] = request.json.get('data')
而我的請(qǐng)求是這樣的:
在這個(gè)工具中,Body不用再像在curl中那樣在花括號(hào)外還要加引號(hào),定義http頭也方便多了。
通過(guò)request.json.get(),flask應(yīng)用就可以解析多個(gè)http頭和json數(shù)據(jù)了。
對(duì)應(yīng)的curl請(qǐng)求為:
hochikong@hochikong-P41T-D3:~$ curl -i -X PUT -H 'Content-Type:application/json' -H 'auth-token:thisismytoken' -d '{"data":"hello world"}' http://localhost:5000/todo/abc HTTP/1.0 201 CREATED Content-Type: application/json Content-Length: 68 Server: Werkzeug/0.10.1 Python/2.7.6 Date: Sat, 18 Apr 2015 15:10:46 GMT { "abc": "hello world", "task": "get the list of docker" }
好,這次實(shí)驗(yàn)基本成功,下一步就是把各種資源分布在不同的python文件中,組織好代碼的放置
研究過(guò)程中遇到的坑:
啟用debug=True后,啟動(dòng)flask應(yīng)用,提示錯(cuò)誤:
ImportError: No module named _winreg
后來(lái)參考這位仁兄的文章修改了six.py(http://www.cnblogs.com/lvzwq/p/4267850.html),
改成這樣:
if attr in ("__file__", "__name__") and self.mod not in sys.modules: # raise AttributeError raise AttributeError(attr) try: _module = self._resolve() except ImportError: raise AttributeError(attr) # _module = self._resolve() value = getattr(_module, attr) setattr(self, attr, value) return value
于是就沒(méi)問(wèn)題了,這是一個(gè)bug
上述內(nèi)容就是如何在flask應(yīng)用中使用多個(gè)http頭并借助PUT實(shí)現(xiàn)POST提交數(shù)據(jù),你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。