あなたのノイズ、わたしのミュージック。

自分が何にどう関心を示したかの記録。

3/8のつめたい夕餉 Flaskクイックスタート


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

<!doctype 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>

アップロード前

f:id:osouonna:20190309021458p:plain:w300

アップロード後

f:id:osouonna:20190309021531p:plain:w300

f:id:osouonna:20190309021547p:plain:w300

指定したディレクトリにファイルがアップロードされました!

なおファイル名の日本語部分は検閲により削除

ちなみにここで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

<!doctype 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のエラーとなるのですが、

f:id:osouonna:20190309031700p:plain:w300

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→前回と同じにつき割愛

f:id:osouonna:20190305004343p:plain:w300

/indexにアクセスすると前回と同じフォームが現れます。

このログインのほうのフォーム埋めてloginボタンを押すと、

f:id:osouonna:20190309033533p:plain:w300

遷移先のページでも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

今週全然手付かずなの、グラフのおかげでもろにバレる。

でもランクインしていたのでハッピー、総ユーザ数は知らんが

f:id:osouonna:20190309040308p:plain:w300

今日は単語70イディオム60フレーズ30。

アメリカ版 大学生物学の教科書 第2巻 分子遺伝学

カラー図解 アメリカ版 大学生物学の教科書 第2巻 分子遺伝学 (ブルーバックス)

カラー図解 アメリカ版 大学生物学の教科書 第2巻 分子遺伝学 (ブルーバックス)

  • 作者: デイヴィッド・サダヴァ,クレイグ.H・ヘラー,ゴードン.H・オーリアンズ,ウィリアム.K・パーヴィス,デイヴィッド.M・ヒリス,石崎泰樹,丸山敬,浅井将,吉河歩
  • 出版社/メーカー: 講談社
  • 発売日: 2010/05/21
  • メディア: 新書
  • 購入: 8人 クリック: 120回
  • この商品を含むブログ (23件) を見る

ブルーバックスのすごいやつ。

第6章 染色体、細胞周期及び細胞分裂の6.3節まで。

細胞分裂のうち有糸分裂の仕組みについて。


3/8の晩御飯

お昼たくさん食べたのでソイジョイとおもちでおしまい。