見出し画像

Python入門 (8) - FlaskによるWebアプリ ケーションの作成

前回

1. Flask

Flask」は、Pythonの軽量Webアプリケーションフレームワークです。

Jinja2」ベースのテンプレートエンジンを利用します。

2. インストール

インストール方法は、次のとおりです。

$ pip install Flask

3. HelloWorld

「Hello World!」と表示するコードは、次のとおりです。

・hello.py

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'
   
if __name__ == "__main__":
    app.run(debug=True)

ブラウザで「http://127.0.0.1:5000/ 」を開くと表示されます。

画像1

◎ app = Flask(__name__)
Flaskのインスタンスを作成します。引数にはアプリのモジュールまたはパッケージ名を指定します。単一のモジュールの場合は、「__ name__」を指定します。

◎ @app.route()
関数をURLにバインドします。関数の戻り値は、ブラウザに表示する文字列です。

◎ app.run()
Flaskのインスタンスを実行します。パラメータは次のとおりです。

・host : ホスト名。(デフォルト:127.0.0.1)
・port : ポート番号。(デフォルト:5000)
・debug : デバッグモードの有効。(デフォルト:None)

4. ルーティング

@app.route()は関数をURLにバインドします。

・@app.route('/') http://127.0.0.1:5000/
・@app.route('/hello') http://127.0.0.1:5000/hello
@app.route('/')
def index():
    return 'Index Page'

@app.route('/hello')
def hello():
    return 'Hello, World'

5. URL変数

@app.route()のURLに<変数名>または<コンバータ:変数名>でURL変数を指定することができます。この変数は関数に引数として渡されます。

・@app.route('/user/<username>')http://127.0.0.1:5000/user/npaka
・@app.route('/post/<int:post_id>')http://127.0.0.1:5000/post/1000
@app.route('/user/<username>')
def show_user_profile(username):
    return 'User %s' % username

@app.route('/post/<int:post_id>')
def show_post(post_id):
    return 'Post %d' % post_id

コンバータには、「string」「int」「float」「path」「any」「uuid」を指定できます。

6. HTTPメソッド

route()methodでHTTPメソッドを指定できます。

from flask import request

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        do_the_login()
    else:
        show_the_login_form()

メソッドには、「GET」「HEAD」「POST」「PUT」「DELETE」「OPTIONS」を指定できます。

7. URLの作成

url_for()は関数名からURLを作成します。

・make_url.py

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

@app.route('/')
def index(): 
    return 'Index Page'

@app.route('/login')
def login(): 
    return 'Login Page'

@app.route('/user/<username>')
def profile(username): 
    return 'User %s' % username

with app.test_request_context():
    print(url_for('index'))
    print(url_for('login'))
    print(url_for('login', next='/'))
    print(url_for('profile', username='John Doe'))
   
if __name__ == "__main__":
    app.run(debug=True)
/
/login
/login?next=%2F
/user/John%20Doe

8. テンプレート

render_template()でテンプレートをレンダリングすることができます。

・main.py

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

@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
    return render_template('hello.html', name=name)
   
if __name__ == "__main__":
    app.run(debug=True)

テンプレートの例は次のとおりです。templatesフォルダ下に配置します。テンプレートの使用は「Jinja2」です。

・templates/hello.html

<!doctype html>
<title>Hello from Flask</title>
{% if name %}
 <h1>Hello {{ name }}!</h1>
{% else %}
 <h1>Hello, World!</h1>
{% endif %}

9. 静的ファイル

テンプレートにCSSやJSファイルを利用する場合は、以下のようなファイル構成にします。

・MyApplication
 ・static
  ・style.css
  ・script.js
 ・templates
  ・index.html
 ・main.py

静的ファイルの名前は、"{{url_for('static', filename='静的ファイルの名前')}}"で指定します。

<html>
  <head>
    <link href="{{url_for('static', filename='style.css')}}" rel="stylesheet">
    <script src="{{url_for('static', filename='script.js')}}"></script>
  </head>
  <body>
    <h1>Hello World!</h1>
  </body>
</html>

10. リクエストデータ

リクエストデータは、requestオブジェクトで提供されます。

◎ URLパラメータ (GET)
URLパラメータ(?key=value)にアクセスするには、request.argsを使います。

from flask import request

searchword = request.args.get('key', '')

◎ フォームパラメータ (POST)
フォームパラメータにアクセスするには、request.formを使います。

from flask import request

@app.route('/login', methods=['POST', 'GET'])
def login():
    error = None
    if request.method == 'POST':
        if valid_login(request.form['username'],
                       request.form['password']):
            return log_the_user_in(request.form['username'])
        else:
            error = 'Invalid username/password'
    return render_template('login.html', error=error)

◎ ファイル
フォームからアップロードしたファイルにアクセスするには、request.filesを使います。フォーム属性に「enctype="multipart/form-data"」が必要になります。

from flask import request

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        f = request.files['the_file']
        f.save('/var/www/uploads/uploaded_file.txt')
   ...

アップロード時のファイル名を知りたい場合は、filenamesecure_filename()を使用できます。

from flask import request
from werkzeug.utils import secure_filename

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        f = request.files['the_file']
        f.save('/var/www/uploads/' + secure_filename(f.filename))
   ...

11. クッキー

◎ クッキーの取得
request.cookies.get()でクッキーを取得することができます。

from flask import request

@app.route('/')
def index():
    username = request.cookies.get('username')

◎ クッキーの保存
make_response()
responseを生成してから、response.set_cookie()でクッキーを保存できます。

from flask import make_response

@app.route('/')
def index():
    resp = make_response(render_template(...))
    resp.set_cookie('username', 'the username')
    return resp

12.  リダイレクトとエラー

redirect()でリダイレクト、abort()でエラー表示を行います。

from flask import abort, redirect, url_for

@app.route('/')
def index():
    return redirect(url_for('login'))

@app.route('/login')
def login():
    abort(401)
    this_is_never_executed()

13. JSON

JSONを返すには、jsonify()を返します。app.config()で日本語のASCII化とキーのソートを無効にしています。

from flask import Flask, jsonify
app = Flask(__name__)
app.config['JSON_AS_ASCII'] = False
app.config["JSON_SORT_KEYS"] = False

@app.route('/hello')
def hello():
    return jsonify({
        'status': 'OK',
        'data': 'こんにちは'
    })

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

【おまけ】 WSGI

WSGIで動作するWebフレームワークは、次のとおりです。

WSGIサーバーは、次のとおりです。

次回


この記事が気に入ったらサポートをしてみませんか?