用flask Flask-RESTful,實現RESTful API

簡介:

自從Roy Fielding博士在2000年他的博士論文中提出REST(Representational State Transfer)風格的軟件架構模式後,REST就基本上迅速取代了複雜而笨重的SOAP,成爲Web API的標準了。html

若是一個URL返回的不是HTML,而是機器能直接解析的數據,這個URL就能夠當作是一個Web API。python

REST就是一種設計API的模式。最經常使用的數據格式是JSON。ajax

比方說下載最流行的AI技術,百度這個流氓仍是開放了API接口,供咱們有限度的免費調用。數據庫

這個使用的就是API。json

學習RESTful API,對咱們之後使用別人開放的API又很大的好處flask

咱們一塊兒來看看RESTFul API有哪些特色:windows

  1. 基於「資源」,數據也好、服務也好,在RESTFul設計裏一切都是資源。
  2. 無狀態。一次調用通常就會返回結果,不存在相似於「打開鏈接-訪問數據-關閉鏈接」這種依賴於上一次調用的狀況。
  3. URL中一般不出現動詞,只有名詞
  4. URL語義清晰、明確
  5. 使用HTTP的GET、POST、DELETE、PUT來表示對於資源的增刪改查
  6. 使用JSON不使用XMLapi

    我舉個例子:
    網站:/get_user?id=3
    RESTFul: GET /user/3 (GET是HTTP類型)瀏覽器


做者:
連接:https://www.imooc.com/article/17650
來源:慕課網
本文原創發佈於慕課網 ,轉載請註明出處,謝謝合做

一:使用RESTful API的好處

1.返回的不是HTML,而是機器能直接解析的數據

隨着ajax的流行,API返回數據,而不是HTML頁面,數據交互量減小,用戶體驗會好。安全

先後臺分離,後臺更多的進行數據處理,前臺對數據進行渲染。

2.直接使用api能夠進行CRUD,增刪改查

一個標準的API,會有4個接口,get,put,post,delete,對應你的請求類型。就是WEB獲取頁面,上傳表單,上傳文件…………

增刪改查,結構清晰

3.使用token令牌來進行用戶權限認證,比cookie更安全

雖然我還沒明白這是什麼意思,可是cookie確實是我爬網站時使用最多的僞造渠道。

4.愈來愈多的開放平臺,開始使用api接口

咱們學習了若是構建API,那麼也就熟悉瞭解瞭如何使用,對之後使用開放API,又很大的幫助。

也許某天,咱們本身寫的程序,也會開放一些API接口給你們用,那也應該符合RESTful API標準。

 

二:快速入門

1.官網

其實這個不是官網,可是是中文文檔。

http://www.pythondoc.com/Flask-RESTful/quickstart.html

2.安裝

安裝 Flask 和 Flask-RESTful。

本人測試環境以下:

Flask==1.0.2
Flask-HTTPAuth==3.2.4
Flask-RESTful==0.3.6
requests==2.19.1
python 3.6.3
windows 10 x64

3.無腦測試

快速入門當中的代碼貌似和我如今的版本不太匹配了。

下面這個是我改好的。

from flask import Flask
from flask_restful import Api,Resource

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

class HelloWorld(Resource):
    def get(self):
        return {'hello': 'world'}

api.add_resource(HelloWorld, '/')

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

這個代碼跑起來看看訪問:http://127.0.0.1:5000,返回值是

{
    "hello": "world"
}

並且咱們沒有註冊首頁路由,用了api.add_resource.。

返回的是一個JSON格式字符串。

三:用requests庫深刻測試

1.get就是咱們平常瀏覽器訪問的方式

沒錯,就是爬蟲用的requests庫。

from requests import get,put,post,delete
#測試get
t1=get('http://127.0.0.1:5000')
print(t1)
#返回碼
print(t1.text)
#內容4

返回值:

<Response [200]>
{
    "hello": "world"
}

返回碼200,返回的text是json數據

2.put

from requests import get,put,post,delete
#測試get
t1=put('http://127.0.0.1:5000')
print(t1)
#返回碼
print(t1.text)
#內容

返回值:

<Response [405]>
{
    "message": "The method is not allowed for the requested URL."
}

還沒寫這個方法

咱們沒寫都會有正確的信息返回,仍是用庫吧,比本身寫方便多了。

主要是更加標準化。

四:完整代碼

1.官方文檔的完整代碼示例

from flask import Flask
from flask_restful import reqparse, abort, Api, Resource

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

TODOS = {
    'todo1': {'task': 'build an API'},
    'todo2': {'task': '?????'},
    'todo3': {'task': 'profit!'},
}


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', type=str)


# Todo
#   show a single todo item and lets you delete them
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(debug=True)

2.深刻測試

from requests import get,put,post,delete

t1=get('http://127.0.0.1:5000/todos')
#測試get 所有
print(t1)
#返回碼
print(t1.text)
#內容


t2=get('http://127.0.0.1:5000/todos/todo1')
#測試獲取一條
print(t2)
print(t2.text)

t3=put('http://127.0.0.1:5000/todos/todo1',data={'task':'jack test'})
#測試修改一條,todo1
print(t3)
print(t3.text)
t4=get('http://127.0.0.1:5000/todos/todo1')
#從新獲取todo1
print(t4)
print(t4.text)

t5=delete('http://127.0.0.1:5000/todos/todo1')
#刪除一個 todo1
print(t5)
print(t5.text)
t6=get('http://127.0.0.1:5000/todos')
#從新獲取所有
print(t6)
print(t6.text)

t7=post('http://127.0.0.1:5000/todos',data={'task':'new line'})
print(t7)
print(t7.text)
#測試建立一個
t8=get('http://127.0.0.1:5000/todos')
print(t8)
print(t8.text)

3.總結

測試代碼中使用了嵌套字典來進行測試,換成數據庫,應該會吧?

 

五:

1.

2.

3.

六:

1.

2.

3.

七:

1.

2.

3.

八:

1.

2.

3.

九:

1.

2.

3.

十:

1.

2.

3.

相關文章
相關標籤/搜索