Python Academy · レッスン

フォームとリクエストデータ

ユーザー入力を処理します

レッスン 3/413 ステップ

「フォームとリクエストデータ」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。

request オブジェクト

Flask では、すべてのビューからグローバルな request オブジェクトにアクセスできます。このオブジェクトには、フォームフィールド、クエリ文字列、JSON、ヘッダーなど、受信したすべてのデータが含まれます。

from flask import Flask, request
app = Flask(__name__)
# request is available inside any view
print('request carries the incoming data')

クエリ文字列のパラメーター

URL の ? 以降にあるデータは request.args に格納されます。.get() を使うと安全に値を読み取れます。

from flask import Flask, request
app = Flask(__name__)

@app.route('/search')
def search():
    term = request.args.get('q', '')
    return 'Searching for ' + term
print('/search?q=cats -> request.args')

HTML フォーム

フォームは送信時にデータを送ります。method 属性と action 属性によって、送信方法と送信先が決まります。

# <form method='POST' action='/login'>
#   <input name='username'>
#   <input name='password' type='password'>
#   <button>Submit</button>
# </form>
print('Form posts username and password')

フォームデータの読み取り

送信されたフォームフィールドは request.form に格納されます。入力要素の name 属性を使ってアクセスします。

from flask import Flask, request
app = Flask(__name__)

@app.route('/login', methods=['POST'])
def login():
    user = request.form['username']
    return 'Welcome ' + user
print('request.form holds posted fields')

get による安全なアクセス

request.form['x'] を使うと、キーが存在しない場合に例外が発生します。代わりに request.form.get('x') を使うと、存在しない場合に None が返されます。

from flask import Flask, request
app = Flask(__name__)

@app.route('/login', methods=['POST'])
def login():
    user = request.form.get('username')
    if not user:
        return 'Missing username', 400
    return 'Welcome ' + user
print('.get avoids KeyError')

1つのビューで GET と POST を処理

よく使われるパターンは、GET でフォームを表示し、POST でデータを処理する方法です。これらを1つのビューにまとめます。

from flask import Flask, request, render_template
app = Flask(__name__)

@app.route('/contact', methods=['GET', 'POST'])
def contact():
    if request.method == 'POST':
        return 'Thanks, ' + request.form.get('name', 'friend')
    return render_template('contact.html')
print('One view, two methods')

入力値の検証

ユーザー入力を決して信頼してはいけません。使用する前に、必須フィールドが存在し、妥当な値になっていることを確認します。

from flask import Flask, request
app = Flask(__name__)

@app.route('/age', methods=['POST'])
def age():
    raw = request.form.get('age', '')
    if not raw.isdigit():
        return 'Age must be a number', 400
    return 'Age is ' + raw
print('Validate before trusting input')

JSON の読み取り

API クライアントは JSON を送信することがよくあります。request.get_json() は本文を Python の dict に解析します。

from flask import Flask, request
app = Flask(__name__)

@app.route('/api', methods=['POST'])
def api():
    data = request.get_json()
    return 'Got name ' + data.get('name', '?')
print('get_json parses the JSON body')

ファイルのアップロード

アップロードされたファイルは request.files に格納されます。検証した後、.save() メソッドで保存します。

from flask import Flask, request
app = Flask(__name__)

@app.route('/upload', methods=['POST'])
def upload():
    f = request.files.get('photo')
    if f:
        return 'Received ' + f.filename
    return 'No file', 400
print('request.files holds uploads')

POST 後のリダイレクト

フォームを処理した後は、更新時の重複送信を避けるためにユーザーをリダイレクトします。redirect(url_for(...)) を使用します。

from flask import Flask, redirect, url_for
app = Flask(__name__)

@app.route('/done')
def done():
    return 'All done'

@app.route('/save', methods=['POST'])
def save():
    return redirect(url_for('done'))
print('Post/Redirect/Get pattern')

フラッシュメッセージ

flash() はリダイレクト後に表示する一度限りのメッセージを保存します。「正常に保存しました」のような確認メッセージに適しています。

from flask import Flask, flash, redirect, url_for
app = Flask(__name__)
app.secret_key = 'change-me'

@app.route('/save', methods=['POST'])
def save():
    flash('Saved successfully')
    return redirect(url_for('save'))
print('flash shows a one-time message')

理解度チェック

フォーム処理に関する知識を確認しましょう。

まとめ

Flask でユーザー入力を処理しました。

  • クエリ文字列には request.args、フォームフィールドには request.form を使います
  • JSON 本文には request.get_json()、アップロードには request.files を使います
  • 常に入力値を検証し、安全にアクセスするには .get() を使います
  • 快適な UX のために Post/Redirect/Get と flash() を使います
無料で開始

AI チューターと学ぶ Python — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
76
レッスン
320

よくある質問

「フォームとリクエストデータ」レッスンは無料ですか?

はい。「フォームとリクエストデータ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。

「フォームとリクエストデータ」で何を学びますか?

ユーザー入力を処理します ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Python Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「フォームとリクエストデータ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPython Academyレッスンでコードを書いて実行できますか?

はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ルートとビュー
  2. Jinja2によるテンプレート
  3. フォームとリクエストデータ
  4. RESTエンドポイントの構築
← Python Academyに戻る