Python 3 – Flask RESTAPIチュートリアル-Pythonチュートリアル

REST APIサービスを使用すると、HTTPリクエストを実行するだけでデータベースを操作できます。 この記事では、Flaskを使用してRESTサーバーを作成する方法を学習します。

多くの場合、これがWebアプリのバックエンドの作成方法です。 返されるデータはJSON形式であり、使用しているリクエストはPUT、DELETE、POST、およびGETです。

APIをオンラインにする場合は、次を使用します。 PythonAnywhere

関連コース: Python Flask:Flaskを使用してWebアプリを作成する

FlaskAPIの例

前書き

最初のプログラムを作成するには、ブラウザにURLを入力したことを思い出してください。

当時、「HelloWorld!」という文字列がありました。 が返されたので、この文字列をjsonシーケンスに置き換えることはできますか? それはRESTクエリAPIと同じではありませんか?

したがって、これを行う最初の衝動があるかもしれません:

1
2
3
4
5
6
7
8
9
10


import json
from flask import Flask
app = Flask(__name__)
@app.route("https://pythonbasics.org/")
def index():
return json.dumps({'name': 'alice',
'email': '[email protected]'})
app.run()

実際には、返された文字列を変更し、JSONの文字列に変更してから、ブラウザで開きました。

フラスコjson

うわー! 必要な機能を達成したようで、JSON文字列を返しました。

しかし、Chromeのデバッグツール(Chrome、Safari、Firefoxに似たツールとして使用しています)(Windowsの場合:Ctrl + Alt + I、Macの場合:Cmd + Shift + I)を開くと、このデータが返されることがわかりますタイプは実際にはタイプhtmlです:

開発ツールコンテンツタイプhtml

これがどのような影響を与えるのか疑問に思われるかもしれません。ほとんどの場合、影響は小さいはずですが、一部のモバイル側ライブラリでは、応答に従ってデータが処理される場合があります(誤って!)。

APIをオンラインにする場合は、次を使用します。 PythonAnywhere

jsonを返す

この状況に対処するために、この応答ヘッドをjson形式に単純に設定することはできません。
より良い解決策は、Flaskのjsonify関数を使用することです。ここで、この関数を使用してコードを変更します。

1
2
3
4
5
6
7
8
9
10
11


import json
from flask import Flask, jsonify
app = Flask(__name__)
@app.route("https://pythonbasics.org/")
def index():
return jsonify({'name': 'alice',
'email': '[email protected]'})

app.run()

変更点は次のとおりです。

1
2
3
4
from flask import ...., jsonify
... ...
return jsonify({'name': 'alice',
'email': '[email protected]'})

フラスコjson応答

Google Dev Toolsを見ると、コンテンツタイプがJSONに変更されていることがわかります。

グーグル開発者ツールjson応答

リクエスト方法

一般的に使用されるHTTPリクエストメソッドは6つあります。

  • 取得する
  • 役職
  • プット
  • 削除
  • パッチ

デフォルトでGETを処理する必要があったコード(ブラウザーのデフォルトはGETを使用)では、他の要求をどのようにプログラムしますか?

このような:

1
2
3
@app.route("https://pythonbasics.org/", methods=['POST'])
@app.route("https://pythonbasics.org/", methods=['DELETE'])
@app.route("https://pythonbasics.org/", methods=['PUT'])

以下のプログラムはこれを示しています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64


import json
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route("https://pythonbasics.org/", methods=['GET'])
def query_records():
name = request.args.get('name')
print name
with open('/tmp/data.txt', 'r') as f:
data = f.read()
records = json.loads(data)
for record in records:
if record['name'] == name:
return jsonify(record)
return jsonify({'error': 'data not found'})

@app.route("https://pythonbasics.org/", methods=['PUT'])
def create_record():
record = json.loads(request.data)
with open('/tmp/data.txt', 'r') as f:
data = f.read()
if not data:
records = [record]
else:
records = json.loads(data)
records.append(record)
with open('/tmp/data.txt', 'w') as f:
f.write(json.dumps(records, indent=2))
return jsonify(record)

@app.route("https://pythonbasics.org/", methods=['POST'])
def update_record():
record = json.loads(request.data)
new_records = []
with open('/tmp/data.txt', 'r') as f:
data = f.read()
records = json.loads(data)
for r in records:
if r['name'] == record['name']:
r['email'] = record['email']
new_records.append(r)
with open('/tmp/data.txt', 'w') as f:
f.write(json.dumps(new_records, indent=2))
return jsonify(record)

@app.route("https://pythonbasics.org/", methods=['DELETE'])
def delte_record():
record = json.loads(request.data)
new_records = []
with open('/tmp/data.txt', 'r') as f:
data = f.read()
records = json.loads(data)
for r in records:
if r['name'] == record['name']:
continue
new_records.append(r)
with open('/tmp/data.txt', 'w') as f:
f.write(json.dumps(new_records, indent=2))
return jsonify(record)

app.run(debug=True)

コードは長いですが、コードは理解しやすく、比較的単純なファイル操作です。

焦点を当てる必要のあるコードは次のとおりです。

  • リクエストメソッドの設定方法
1
2
3
4
@app.route("https://pythonbasics.org/", methods=['GET'])
@app.route("https://pythonbasics.org/", methods=['PUT'])
@app.route("https://pythonbasics.org/", methods=['POST'])
@app.route("https://pythonbasics.org/", methods=['DELETE'])

APIをオンラインにする場合は、次を使用します。 PythonAnywhere

Hope this helps!

Source link