![見出し画像](https://assets.st-note.com/production/uploads/images/59927544/rectangle_large_type_2_c4ea91b8019298b3b552cbdf52ff92ba.png?width=800)
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/ 」を開くと表示されます。
◎ 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')
...
アップロード時のファイル名を知りたい場合は、filenameとsecure_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サーバーは、次のとおりです。
次回
この記事が気に入ったらサポートをしてみませんか?