3/8の晩御飯のおとも
Flaskクイックスタート
a2c.bitbucket.io
3/4の夕餉の続き。
今回ほとんどチュートリアル通りなのでさくっと、起動も前回同様python3.7 start.py
で。
ファイルアップロード
enctype="multipart/form-data" 属性をHTMLフォームにセットするのだけ忘れないでください。
そうしないとブラウザがファイル通信できなくなってしまいます。
読み切るよりも先に手を動かすのはやめようと思いました(なりました)。
start.py
from flask import Flask
from flask import render_template, request
from werkzeug import secure_filename
app = Flask(__name__)
@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
f = request.files['the_file']
f.save('アップロード用ディレクトリへのパス' + secure_filename(f.filename))
return render_template('upload.html')
if __name__ == '__main__':
app.run(debug=True)
upload.html
<title>Upload from Flask</title>
<form name="upload" action="/upload" method="POST" enctype="multipart/form-data">
<p>Please select the file to be uploaded.</p>
<input type="file" name="the_file"><br>
<input type="submit" value="upload">
</form>
アップロード前
アップロード後
指定したディレクトリにファイルがアップロードされました!
なおファイル名の日本語部分は検閲により削除
ちなみにここでimportされているWerkzeugはFlaskの構成ライブラリのなかでも主要なひとつで、
Webアプリケーションをつくるのに便利な機能が詰まっているものなのだそう、WSGIに準拠。
今回はクライアント側で名付けられたもとのファイル名によってアプリケーションに悪影響及ばないように色々退けてくれる(つまりさっきの検閲により削除の検閲元)、
secure_filenameが使われています。
.
※参考(にしたい)リンク達
enctype="multipart/form-data"関連
フォームデータの送信 - ウェブ開発を学ぶ | MDN
enctype='multipart/form-data'ってなんだ? - MUGENUP技術ブログ
Werkzeug関連
Werkzeug Tutorial — Werkzeug Documentation (0.14)
Web Server Gateway Interface - Wikipedia
WerkzeugでFlaskを使ったPythonのWebAppをプロファイリングする
「werkzeug」でWSGIアプリをつくろう! — PythonMatrixJp
WerkzeugとJinja2の力を融合させたやつがFlaskみたいな感じなのだろうか。超魔導剣士ブラックパラディン的な
リダイレクト及び例外の発生
start.py
from flask import Flask
from flask import url_for, render_template, abort, redirect
app = Flask(__name__)
@app.route('/')
def index():
return redirect(url_for('to_abort'))
@app.route('/abort')
def to_abort():
abort(401)
@app.errorhandler(404)
def page_not_found(error):
return render_template('page_not_found.html'), 404
if __name__ == '__main__':
app.run(debug=True)
page_not_found.html
<h1>がんばれ!メロディー</h1>
この状態でhttp://127.0.0.1:5000/にアクセスすると、http://127.0.0.1:5000/abortにリダイレクトさせられた挙句に401 Unauthorizedのエラーが吐き出されます。鬼畜みたいな作例だ
また、/abortじゃなくて/aboutだったわとURL打ち直しても今回はabout.htmlを用意していないため、404 Not Foundのエラーとなるのですが、
URLは据え置きのままに表示が上記のpage_not_found.htmlの内容に置き換えられると、つまり独自のエラー画面を配置できるというわけですね。
余談ですが柴田聡子さんのがんばれ!メロディー、とても聴きやすくなっていいですね、っていうかアルバム名あまりにもずるい
セッション
前回ちょっと調べていくうちに足を踏み入れてしまったあたりだ。復習も兼ねて。
start.py
from flask import Flask
from flask import url_for, render_template, request, session, redirect, escape
import os
app = Flask(__name__)
@app.route('/')
def index():
if 'username' in session:
return 'Logged in as %s' % escape(session['username'])
return render_template('index.html')
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
session['username'] = request.form['username']
return redirect(url_for('index'))
@app.route('/logout')
def logout():
session.pop('username', None)
return redirect(url_for('index'))
if __name__ == '__main__':
app.secret_key = os.urandom(12)
app.run(debug=True)
index.html及びlogin.html→前回と同じにつき割愛
/indexにアクセスすると前回と同じフォームが現れます。
このログインのほうのフォーム埋めてloginボタンを押すと、
遷移先のページでもusernameが保持されていることがわかる。まあ今回index.htmlにリダイレクトしてしまっているので遷移感薄いですが……。
この状態だといくら/indexにアクセスしても"Logged in……"のメッセージが出てきてしまうので、/logoutにアクセスしましょう。また最初のフォームが現れてくれます。
(ログアウトボタン作るの忘れていたのは内緒)
.
セッション使うときには秘密鍵の設定が必要みたいです。
今回はFlask.secret_keyにos.urandomで作った乱数ぶっこんで設定。
CTF的 Flaskに対する攻撃まとめ - Qiita
あとはこまごまだったり仕組み自体の理解が追いつかなかったり流石に眠かったりなのでここまで。
flask.pocoo.org
日本語訳されてるバージョンのクイックスタートだいぶ古いバージョンみたいでされてないバージョンは記法もPython3系であったし紹介されている昨日もとてもとてもなのとに気がついてしまったけどたぶん夢なので寝ます。
.
シンプルイズ奥が深い、いやたぶん見通しがいいからこそ奥まっているその様を把握しやすいのだろうか。
Djangoとか魔境めいたとこあるから……。
そのほかにかじったもの。
エンジリッシュ
https://e-lish.io/desk/user/detail/3231
今週全然手付かずなの、グラフのおかげでもろにバレる。
でもランクインしていたのでハッピー、総ユーザ数は知らんが
今日は単語70イディオム60フレーズ30。
アメリカ版 大学生物学の教科書 第2巻 分子遺伝学
ブルーバックスのすごいやつ。
第6章 染色体、細胞周期及び細胞分裂の6.3節まで。
細胞分裂のうち有糸分裂の仕組みについて。
3/8の晩御飯
お昼たくさん食べたのでソイジョイとおもちでおしまい。