Flask Test Client - GET / POST examples

Posted on  Sep 15, 2018  in  Flask  by  Amo Chen  ‐ 1 min read

Flask 的 test client 其實是複用 WerkzeugClient 支援 get patch post head 等方法。

不過文件中對於各個方法可以使用的參數並沒有寫得十分清楚,本篇紀錄常見的 get post 使用方法。

前情提要

本文環境為:

  • Flask 1.0.2
  • Python 3.6.5
  • py.test 3.5.1

本文使用以下 Flask APP 作為要測試的目標 ( app.py ) ,此 app 會將收到的 HTTP request 中的 GET parameters 及 POST 的內容轉成 JSON 後回應:

# -*- coding: utf-8 -*-
from flask import Flask
from flask import request
from flask import jsonify


app = Flask(__name__)


@app.route('/', methods=['GET', 'POST'])
def home():
    method = request.method
    if method == 'GET':
        content_dict = request.args

    elif method == 'POST':
        content_dict = request.json
        content_dict.update(request.headers)

    return jsonify(content_dict)

本文開始

Flask 官方文件推薦使用 py.test 進行測試,因此可以看到官方文件中將 test client 製作成 fixture ,以方便進行測試:

import pytest

from app import app


@pytest.fixture
def client():
    app.config['TESTING'] = True
    with app.app_context():
        client = app.test_client()
        yield client

p.s. 不懂 py.test 的話,可以參考 pytest 教學

而用過 requests 的人一定也會覺得 Werkzeug 的 test client 很像,大部分的參數及用法都很類似,例如 headers data content_type 等等,但是 requests 模組的 get 方法有支援 params 的用法,而相同的參數在 Werkzeug 的 test client 無法使用,原因是因為 Werkzeug 的 test client 的 params 叫做 query_string ,所以要在 get 方法很方便地加上 URL 的 parameters 時,就得改用 query_string 。

以下就是 Flask test client 的 get / post 的範例,細節就不加以詳述了。

# -*- coding: utf-8 -*-
import json

import pytest

from app import app


@pytest.fixture
def client():
    app.config['TESTING'] = True
    with app.app_context():
        client = app.test_client()
        yield client


def test_get_home(client):
    resp = client.get(
        '/',
        headers={
            'X-My-Header': 'Header',
        },
        query_string={
            'ref': 'google',
        },
    )


def test_post_home(client):
    resp = client.post(
        '/',
        headers={
            'X-My-Header': 'Header',
        },
        data=json.dumps({
            'ref': 'google',
        }),
        content_type='application/json',
    )

對抗久坐職業傷害

研究指出每天增加 2 小時坐著的時間,會增加大腸癌、心臟疾病、肺癌的風險,也造成肩頸、腰背疼痛等常見問題。

然而對抗這些問題,卻只需要工作時定期休息跟伸展身體即可!

你想輕鬆改變現狀嗎?試試看我們的 PomodoRoll 番茄鐘吧! PomodoRoll 番茄鐘會根據你所設定的專注時間,定期建議你 1 項辦公族適用的伸展運動,幫助你打敗久坐所帶來的傷害!

贊助我們的創作

看完這篇文章了嗎? 休息一下,喝杯咖啡吧!

如果你覺得 MyApollo 有讓你獲得實用的資訊,希望能看到更多的技術分享,邀請你贊助我們一杯咖啡,讓我們有更多的動力與精力繼續提供高品質的文章,感謝你的支持!