国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Flask 擴展系列之 Flask-RESTful

阿羅 / 3004人閱讀

摘要:勵以最少的安裝方式進行最佳實踐。上面的例子接收了一個對象并準備將其序列化。裝飾器會通過進行轉換。從對象中提取的唯一字段是。是一個特殊的字段,它接受端點名稱并為響應中的端點生成一個。可以查看項查看完整列表。

大綱

簡介

安裝

快速入門

一個最小的 api 例子

資源豐富的路由

端點

參數解析

數據格式化

完整 TODO 應用例子

簡介

Flask-RESTful是一個Flask的擴展,它增加了對快速構建REST APIs的支持。它是一種輕量級的抽象,可以與現有的ORM/庫一起工作。Flask-RESTful勵以最少的安裝方式進行最佳實踐。如果你對Flask很熟悉的,Flask-RESTful會很容易上手。

安裝

本文環境:python3

pip3 install flask-restful
快速入門 一個最小的API

下面來編寫一個最小的Flask-RESTful API:

from flask import Flask
from flask_restful import Resource, Api

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) 

保存代碼到api.py測試時打開debug模式會提供代碼重載,以及更詳細的錯誤信息。注意調試模式不可用在生產環境。接下來打開命令窗口輸入命令執行py 文件

$ python api.py
 * Running on http://127.0.0.1:5000/
 * Restarting with reloader

新建一個命令窗口,使用curl測試下API

$ curl http://127.0.0.1:5000/
{"hello": "world"}
資源豐富的路由

Flask-RESTful 提供的最主要的基礎就是資源,資源是構建在Flask 可插拔的視圖之上,只要在你的資源上定義方法就能很容易的訪問多個 HTTP 方法,一個待辦事項應用的基礎 CRUD資源的編寫像這樣:

from flask import Flask, request
from flask_restful import Resource, Api

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

todos = {}

class TodoSimple(Resource):
    def get(self, todo_id):
        # 從 todos 字典中讀取數據 注:此處沒有對不存在的 key 做處理
        return {todo_id: todos[todo_id]}

    def put(self, todo_id):
        # 將數據保存到 todos 字典中
        todos[todo_id] = request.form["data"]
        return {todo_id: todos[todo_id]}

# 增加資源到 api, 匹配字符串到資源方法的變量
api.add_resource(TodoSimple, "/")

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

保存到文件后執行,使用 curl測試一下

$ curl http://localhost:5000/todo1 -d "data=Remember the milk" -X PUT
{"todo1": "Remember the milk"}

$ curl http://localhost:5000/todo1
{"todo1": "Remember the milk"}

$ curl http://localhost:5000/todo2 -d "data=Change my brakepads" -X PUT
{"todo2": "Change my brakepads"}

$ curl http://localhost:5000/todo2
{"todo2": "Change my brakepads"}

如果有安裝 python 的 requests 庫也可以用以下方法測試 (Python庫系列之requests):

>>> from requests import put, get
>>> put("http://localhost:5000/todo1", data={"data": "Remember the milk"}).json()
{"todo1": "Remember the milk"}
>>> get("http://localhost:5000/todo1").json()
{u"todo1": u"Remember the milk"}
>>> put("http://localhost:5000/todo2", data={"data": "Change my brakepads"}).json()
{u"todo2": u"Change my brakepads"}
>>> get("http://localhost:5000/todo2").json()
{u"todo2": u"Change my brakepads"}

Flask-RESTful支持視圖方法多種類型的返回值,像 Flask 一樣,你可以返回任何迭代器,它會被轉化成一個包含原始響應對象的響應,Flask-RESTful還支持使用多個返回時來設置響應碼以及響應頭,如下:

class Todo1(Resource):
    def get(self):
        # 默認返回200
        return {"task": "Hello world"}

class Todo2(Resource):
    def get(self):
        # 將響應碼設為201
        return {"task": "Hello world"}, 201

class Todo3(Resource):
    def get(self):
        # 將響應碼設置為201,并返回自定義頭
        return {"task": "Hello world"}, 201, {"Etag": "some-opaque-string"}

api.add_resource(Todo1, "/t1")
api.add_resource(Todo2, "/t2")
api.add_resource(Todo3, "/t3")

保存到文件后執行,使用 curl 測試一下

$curl http://127.0.0.1:5000/t1 -I
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 30
Server: Werkzeug/0.12.2 Python/3.6.4
Date: Wed, 03 Jan 2018 15:07:07 GMT

$curl http://127.0.0.1:5000/t2 -I
HTTP/1.0 201 CREATED
Content-Type: application/json
Content-Length: 30
Server: Werkzeug/0.12.2 Python/3.6.4
Date: Wed, 03 Jan 2018 15:07:10 GMT

$curl http://127.0.0.1:5000/t3 -I
HTTP/1.0 201 CREATED
Content-Type: application/json
Content-Length: 30
Etag: some-opaque-string
Server: Werkzeug/0.12.2 Python/3.6.4
Date: Wed, 03 Jan 2018 15:05:58 GMT
端點

很多時候在一個 API 中,你的資源可以通過多個URLs訪問。你可以把多個 URLs 傳給 Api 對象的 add_resource() 方法。每一個 URL 都能訪問到你的資源

api.add_resource(HelloWorld,
    "/",
    "/hello")

你還可以將路徑的部分匹配為資源方法的變量

api.add_resource(Todo,
    "/todo/", endpoint="todo_ep")
注:

如果一個請求與你的應用程序端點中的任何一個都不匹配,Flask-RESTful 將會返回404錯誤,并附帶一段有關其它最相似匹配的端點建議。你可以通過在配置中將ERROR_404_HELP設置為 False禁用此項。

參數解析

盡管 Flask 提供了便捷的方式獲取請求的數據(例:查詢字符串或POST 表單編碼的數據),驗證表單依舊很痛苦。Flask-RESTful 內置了支持驗證請求數據,它使用了一個類似argparse 的庫。

from flask_restful import reqparse

parser = reqparse.RequestParser()
parser.add_argument("rate", type=int, help="Rate to charge for this resource")
args = parser.parse_args()
注:與 argparse 模塊不同的是,reqparse.RequestParser.parse_args() 返回了 Python 字典而不是一個自定義的數據結構。

使用 reqparse 模塊同樣可以自由地提供全面的錯誤信息。如果一個參數沒有通過校驗,Flask-RESTful 將會以一個400的錯誤請求以及高亮的錯誤信息回應。

$ curl -d "rate=foo" http://127.0.0.1:5000/todos
{"status": 400, "message": "foo cannot be converted to int"}

inputs模塊提供許多常用的轉換函數,像 inputs.date() 和 inputs.url()。

調用 parse_args 傳入 strict=True 能夠確保當請求包含了你的解析器中未定義的參數時拋出一個異常。

args = parser.parse_args(strict=True)
數據格式化

默認情況下,在你的迭代返回中所有的字段都將會原樣呈現。當你處理 Python 數據結構的時候會覺得它很棒,但在處理對象時會變得非常令人沮喪。為了解決這個問題,Flask-RESTful 提供了fields 模塊以及 marshal_with()裝飾器。類似 Django ORM 和 WTForm ,你可以使用 fields 模塊來描述響應的數據結構。

from flask_restful import fields, marshal_with

resource_fields = {
    "task":   fields.String,
    "uri":    fields.Url("todo_ep")
}

class TodoDao(object):
    def __init__(self, todo_id, task):
        self.todo_id = todo_id
        self.task = task

        # This field will not be sent in the response
        self.status = "active"

class Todo(Resource):
    @marshal_with(resource_fields)
    def get(self, **kwargs):
        return TodoDao(todo_id="my_todo", task="Remember the milk")

上面的例子接收了一個 python對象并準備將其序列化。marshal_with()裝飾器會通過resource_fields()進行轉換。從對象中提取的唯一字段是 task。fields.Url是一個特殊的字段,它接受端點名稱并為響應中的端點生成一個URL。您需要的許多字段類型已經包含在其中。可以查看 fields 項查看完整列表。

完整 TODO 應用例子
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")


# Todo
# 顯示單個待辦任務,并允許刪除待辦任務項
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
# 展示所有 todos 的列表,允許以POST的方式新建一個 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

# 設置 api 資源路由
api.add_resource(TodoList, "/todos")
api.add_resource(Todo, "/todos/")


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

例子使用:

$ python api.py
 * Running on http://127.0.0.1:5000/
 * Restarting with reloader

獲取 Todo 列表

$ curl http://localhost:5000/todos
{"todo1": {"task": "build an API"}, "todo3": {"task": "profit!"}, "todo2": {"task": "?????"}}

獲取單個 Todo 任務

$ curl http://localhost:5000/todos/todo3
{"task": "profit!"}

刪除一個任務

$ curl http://localhost:5000/todos/todo2 -X DELETE -v

> DELETE /todos/todo2 HTTP/1.1
> Host: localhost:5000
> User-Agent: curl/7.52.1
> Accept: */*
>
* HTTP 1.0, assume close after body
< HTTP/1.0 204 NO CONTENT
< Content-Type: application/json
< Content-Length: 0
< Server: Werkzeug/0.12.2 Python/3.6.4
< Date: Wed, 03 Jan 2018 16:07:19 GMT

添加一個新的任務

$ curl http://localhost:5000/todos -d "task=something new" -X POST -v

> POST /todos HTTP/1.1
> Host: localhost:5000
> User-Agent: curl/7.52.1
> Accept: */*
> Content-Length: 18
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 18 out of 18 bytes
* HTTP 1.0, assume close after body
< HTTP/1.0 201 CREATED
< Content-Type: application/json
< Content-Length: 32
< Server: Werkzeug/0.12.2 Python/3.6.4
< Date: Wed, 03 Jan 2018 16:05:27 GMT
<
{
    "task": "something new"
}
* Curl_http_done: called premature == 0
* Closing connection 0

更新任務

$ curl http://localhost:5000/todos/todo3 -d "task=something different" -X PUT -v

> PUT /todos/todo3 HTTP/1.1
> Host: localhost:5000
> User-Agent: curl/7.52.1
> Accept: */*
> Content-Length: 24
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 24 out of 24 bytes
* HTTP 1.0, assume close after body
< HTTP/1.0 201 CREATED
< Content-Type: application/json
< Content-Length: 38
< Server: Werkzeug/0.12.2 Python/3.6.4
< Date: Wed, 03 Jan 2018 16:09:05 GMT
<
{
    "task": "something different"
}
* Curl_http_done: called premature == 0
* Closing connection 0
本文關鍵詞

Python

Flask-RESTful

curl

requests

更多閱讀

Flask-RESTful — Flask-RESTful 0.3.6 documentation

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41177.html

相關文章

  • 使用 Flask 和 AngularJS 構建博客 - 1

    摘要:注原文作者,原文地址為在這個教程中,我們將使用和構建一個博客。在開發期間,這將允許我們把它們運行在不同的端口例如和。現在我們將進入目錄并使用運行這個腳本。示例創建一篇文章為了創建一篇文章,你需要發送一個請求給。 注:原文作者 John Kevin M. Basco,原文地址為 Building a blog using Flask and AngularJS Part 1 在...

    劉玉平 評論0 收藏0
  • 使用 Flask 和 AngularJS 構建博客 - 1

    摘要:注原文作者,原文地址為在這個教程中,我們將使用和構建一個博客。在開發期間,這將允許我們把它們運行在不同的端口例如和。現在我們將進入目錄并使用運行這個腳本。示例創建一篇文章為了創建一篇文章,你需要發送一個請求給。 注:原文作者 John Kevin M. Basco,原文地址為 Building a blog using Flask and AngularJS Part 1 在...

    lavnFan 評論0 收藏0
  • Flask-restful 用法及自定義參數錯誤信息

    摘要:是我們自定義的錯誤碼為啟動文件當我們運行的時候,程序便啟動了起來。在中修改只要為,報參數錯誤正常返回消息把中的方法改為我們自己定義的方法現在再次運行瀏覽器輸入即可得到輸入檢測一下正常輸出完美 flask-restful 是一款比較好用的 flask 插件,它不僅自動為我們實現了數據的 json 化,還能對傳入參數進行驗證,優雅的替代了 form 表單。 代碼結構: app |_api...

    Dogee 評論0 收藏0
  • Flask開發記錄系列一項目骨架

    第一步,完成項目骨架。 https://github.com/xbynet/flask-skeleton backend all the requirements show the bellow: Flask==0.11.1 Werkzeug==0.11.11 Jinja2==2.8 SQLAlchemy==1.1.2 celery==3.1.23 Flask-sqlalchemy==2.1 f...

    xiaoqibTn 評論0 收藏0
  • 使用flask開發api——部署flask,使用gunicorn+gevent模式的http ser

    摘要:使用開發部署,使用模式的用開發了服務端的,記錄部署上服務器的過程,以供后續使用。退出虛擬環境如果服務器中沒有安裝,先進行安裝增加配置文件創建配置文件編輯內容如下更新會提示相關的進程已經被加入要關閉相關的進程可以用開啟可以用 使用flask開發api——部署flask,使用gunicorn+gevent模式的http server 用flask開發了服務端的api,記錄部署上服務器的過程...

    XboxYan 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<