欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

怎么使用Flask構(gòu)建簡(jiǎn)單的RESTful服務(wù)-創(chuàng)新互聯(lián)

本篇文章給大家分享的是有關(guān)怎么使用Flask構(gòu)建簡(jiǎn)單的RESTful服務(wù),小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

創(chuàng)新互聯(lián)是一家專業(yè)從事成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)的品牌網(wǎng)絡(luò)公司。如今是成都地區(qū)具影響力的網(wǎng)站設(shè)計(jì)公司,作為專業(yè)的成都網(wǎng)站建設(shè)公司,創(chuàng)新互聯(lián)依托強(qiáng)大的技術(shù)實(shí)力、以及多年的網(wǎng)站運(yùn)營(yíng)經(jīng)驗(yàn),為您提供專業(yè)的成都網(wǎng)站建設(shè)、營(yíng)銷型網(wǎng)站建設(shè)及網(wǎng)站設(shè)計(jì)開發(fā)服務(wù)!

    我們現(xiàn)在的一個(gè)項(xiàng)目是使用Django來構(gòu)建,說來也是基于技術(shù)擴(kuò)展的考慮,我對(duì)于Django里面大而全的一些組件還是持有保守態(tài)度,所以雖然項(xiàng)目用了Django,但是對(duì)于很多組件的使用都是盡可能少用或者不用,這樣一來雖然前期清苦些,但是從現(xiàn)在來看,由于依賴很低,我可以匹配很多種其他的方案。

    當(dāng)然對(duì)我來說我格外喜歡Django的ORM方案,這個(gè)我對(duì)比了下Flask方向的ORM方案SQLAlchemy,Django的感覺要更好一些。

    而在RESTful的方向上,Django自身的第三方實(shí)現(xiàn)rest_framework也不錯(cuò),現(xiàn)在看起來很簡(jiǎn)單的概念和實(shí)現(xiàn),用了很長(zhǎng)一段時(shí)間才徹底理解。

    而反過來看下Flask的RESTful方案,其實(shí)也有一定的借鑒意義。

    Flask比Django要簡(jiǎn)練的多,我們來看一個(gè)最簡(jiǎn)單的Flask例子,比如開啟一個(gè)web服務(wù),打印出hello world

    代碼如下:

    from flask import Flask

    app = Flask(__name__)

    @app.route('/')

    def hello_world():

      return 'Hello World!'

    if __name__ == '__main__':

      app.run('192.168.56.102')

最后的IP是我的服務(wù)器IP,可以根據(jù)需要替換。

使用如下的方式來運(yùn)行,服務(wù)即可開啟。

[root@dev01 flask]# python hello.py 

 * Running on http://192.168.56.102:5000/ (Press CTRL+C to quit)

192.168.56.1 - - [19/May/2018 22:29:22] "GET / HTTP/1.1" 200 -

192.168.56.1 - - [19/May/2018 22:29:22] "GET /favicon.ico HTTP/1.1" 404 -

192.168.56.1 - - [19/May/2018 22:29:22] "GET /favicon.ico HTTP/1.1" 404 -

得到的結(jié)果如下:

請(qǐng)輸入描述

到了這里,如果是做過Python Web開發(fā)的同學(xué)很可能說,這不是忽悠我呢,Python自身的技術(shù)也可以實(shí)現(xiàn),本身Python就實(shí)現(xiàn)了一個(gè)SimpleHttpServer,可以參見之前的一篇文章:?如果理解Python web開發(fā)技術(shù)?

里面的代碼看起來更簡(jiǎn)潔:

#!/usr/bin/env python
#coding:utf-8

from wsgiref.simple_server import make_server
def RunServer(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return '<h2>Hello, wsgi!</h2>'

if __name__ == '__main__':
    httpd = make_server('', 8000, RunServer)
    print "Serving HTTP on port 8000..."
    httpd.serve_forever()

我們來看看一個(gè)相對(duì)完整的Flask代碼示例,內(nèi)容參考了:https://www.jianshu.com/p/6ac1cab17929

代碼如下:

#!/usr/bin/env python

# -*- coding: utf-8 -*-

# by vellhe 2017/7/9

from flask import Flask, abort, request, jsonify

app = Flask(__name__)

# 測(cè)試數(shù)據(jù)暫時(shí)存放

tasks = []

@app.route('/add_task/', methods=['POST'])

def add_task():

 #需要自己來維護(hù)這個(gè)列表結(jié)構(gòu)

  if not request.json or 'id' not in request.json or 'info' not in request.json:

    abort(400)

  task = {

    'id': request.json['id'],

    'info': request.json['info']

  }

  tasks.append(task)

  return jsonify({'result': 'success'})

@app.route('/get_task/', methods=['GET'])

def get_task():

  if not request.args or 'id' not in request.args:

    # 沒有指定id則返回全部

    return jsonify(tasks)

  else:

    task_id = request.args['id']

    task = filter(lambda t: t['id'] == int(task_id), tasks)

    return jsonify(task) if task else jsonify({'result': 'not found'})

if __name__ == "__main__":

  # 將host設(shè)置為192.168.56.102,則外網(wǎng)用戶也可以訪問到這個(gè)服務(wù)

  app.run(host="192.168.56.102", port=8383, debug=True)

這個(gè)程序的一個(gè)難點(diǎn)就是如何在瀏覽器中模擬這個(gè)POST請(qǐng)求,當(dāng)然可以使用postman來做,windows端可以參考這個(gè)鏈接下載:

https://app.getpostman.com/app/download/win64

第二個(gè)難點(diǎn)就是對(duì)于JSON的處理,里面還是有很多的參考之處。總體感覺雖然可以實(shí)現(xiàn),但是所有的細(xì)節(jié)都需要自己來控制,比如輸入結(jié)構(gòu),輸出結(jié)構(gòu),信息查找的匹配,還有url和方法的映射。總是感覺有些拖泥帶水,拖累太重,you can you up的感覺。

使用RESTful的方式,在Flask里面就是引入這個(gè)模塊即可,相對(duì)來說比較簡(jiǎn)潔和輕量。

要安裝flask_restful的話,一個(gè)命令即可。

pip install flask_restful

比如我有個(gè)需求,做一個(gè)基本的任務(wù)管理需求,可以分為兩類功能,對(duì)任務(wù)理和任務(wù)列表管理,任務(wù)管理包括查看任務(wù),增加,刪除任務(wù),都是對(duì)應(yīng)單一的任務(wù)。任務(wù)列表就是對(duì)多個(gè)任務(wù)信息的查詢和添加。

這種需求,其實(shí)基本的處理單元是任務(wù),每一層級(jí)都可以不斷的細(xì)化。盡可能對(duì)于應(yīng)用層面來說更加透明,比如我就開放一個(gè)url: todos完成任務(wù)列表的管理,可以查看任務(wù)列表,添加任務(wù)信息。

todos/todo1 完成對(duì)單一任務(wù)的管理,比如添加修改,刪除。

這個(gè)例子可能聽起來不是很清晰,我舉一個(gè)生活中的例子,比如你去一個(gè)游樂園,只有一個(gè)服務(wù)臺(tái),充值,退卡,辦卡的需求都是在這一個(gè)柜臺(tái)辦理。這個(gè)時(shí)候需求可能是這幾類:

比如你給他100塊錢,那就意味著你要辦卡,并且充值相應(yīng)的金額(可能還要扣除工本費(fèi))

比如你給他100塊錢,并且?guī)Эǎ蔷鸵馕吨阋渲?/p>

比如你給他一張卡,那就意味著你要退錢。

所以上述的需求,輸入可能很簡(jiǎn)單,但是對(duì)應(yīng)的業(yè)務(wù)場(chǎng)景可能截然不同。所以上述的代碼要實(shí)現(xiàn)這個(gè)需求,邏輯還是比較復(fù)雜,而且不夠清晰。

RESTful里面的一個(gè)優(yōu)勢(shì)就是可以基于class來構(gòu)建不同的需求接口,可能對(duì)外開放的url是一個(gè)統(tǒng)一入口,但是可以在這個(gè)基礎(chǔ)上進(jìn)行細(xì)化。比如url: /todos和/todos/todo1

寫一個(gè)程序腳本來實(shí)現(xiàn):

#!/usr/bin/env python

# -*- coding: utf-8 -*-

from flask import Flask

from flask_restful import reqparse, abort, Api, Resource

app = Flask(__name__)

api = Api(app)

TODOS = {

  'todo1': {'task': 'test1'},

  'todo2': {'task': 'test2'},

  'todo3': {'task': 'test3'},

}

def abort_if_todo_doesnt_exist(todo_id):

  if todo_id not in TODOS:

    abort(404, message="Todo {} doesn't exist".format(todo_id))

parser = reqparse.RequestParser()

parser.add_argument('task')

# Todo

# shows a single todo item and lets you delete a todo item

class Todo(Resource):

  def get(self, todo_id):

    abort_if_todo_doesnt_exist(todo_id)

    return TODOS[todo_id]

  def delete(self, todo_id):

    abort_if_todo_doesnt_exist(todo_id)

    del TODOS[todo_id]

    return '', 204

  def put(self, todo_id):

    args = parser.parse_args()

    task = {'task': args['task']}

    TODOS[todo_id] = task

    return task, 201

# TodoList

# shows a list of all todos, and lets you POST to add new tasks

class TodoList(Resource):

  def get(self):

    return TODOS

  def post(self):

    args = parser.parse_args()

    todo_id = int(max(TODOS.keys()).lstrip('todo')) + 1

    todo_id = 'todo%i' % todo_id

    TODOS[todo_id] = {'task': args['task']}

    return TODOS[todo_id], 201

##

## Actually setup the Api resource routing here

##

api.add_resource(TodoList, '/todos')

api.add_resource(Todo, '/todos/<todo_id>')

if __name__ == '__main__':

  app.run('192.168.56.102',debug=True)

調(diào)用情況如下:

怎么使用Flask構(gòu)建簡(jiǎn)單的RESTful服務(wù)

請(qǐng)輸入描述

如果是查看某一個(gè)task的信息,可以直接輸入即可匹配。

怎么使用Flask構(gòu)建簡(jiǎn)單的RESTful服務(wù)

請(qǐng)輸入描述

看一下代碼其實(shí)會(huì)發(fā)現(xiàn),這里注冊(cè)了兩個(gè)API,這里和上面程序的不同就在于里面使用了Resource做了封裝,如果我要添加一個(gè)邏輯,其實(shí)也是很方便的。不需要堆砌一大堆的if-else

以上就是怎么使用Flask構(gòu)建簡(jiǎn)單的RESTful服務(wù),小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道。

名稱欄目:怎么使用Flask構(gòu)建簡(jiǎn)單的RESTful服務(wù)-創(chuàng)新互聯(lián)
URL網(wǎng)址:http://chinadenli.net/article42/ehgec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站動(dòng)態(tài)網(wǎng)站營(yíng)銷型網(wǎng)站建設(shè)微信公眾號(hào)品牌網(wǎng)站設(shè)計(jì)服務(wù)器托管

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)