kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

PPP3: こんどこそFlask

Pythonのコードも手で入れていくよ

こういうところは決まった書式なんだろうか

    """
    :param start: 乗った駅
    :type start: str
    """

あとで説明されるSphinx + reStructuredTextの形式ってことかな
この形式でもmypyが型をチェックしてくれたりするのかな

・・・

どうやらこのへんの書き方はけっこうユルくていろんな流儀があるみたい
ということはmypyが見てくれたりはなさそうだ
今なら型ヒントつけるのが正しそう

save_dataload_dataを作って、いよいよFlaskを使う
ソースはこのへん

from flask import Flask, render_template

application = Flask(__name__)

  :

@application.route('/')
def index():
    return render_template('index.html')

if __name__ == '__main__':
    application.run('0.0.0.0', 8000, debug=True)

@application.route('/')ってとこがミソだなたぶん
どういう仕組みなんだろう
でも今日はちょっと無視

実行

vagrant@vagrant:/vagrant_data/norilog$ python norilog.py
  File "norilog.py", line 11
SyntaxError: Non-ASCII character '\xe8' in file norilog.py on line 11, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

あーやっぱりなー
venvするの忘れてる
こういうの忘れると思ったんですよ
.bashrcにでも書いといてやろうか

venvして実行

vagrant@vagrant:/vagrant_data/norilog$ source venv/bin/activate
(venv) vagrant@vagrant:/vagrant_data/norilog$ python norilog.py
 * Serving Flask app "norilog" (lazy loading)
  :
 * Restarting with stat
Traceback (most recent call last):
  File "norilog.py", line 64, in <module>
    application.run('0.0.0.0', 8000, debug=True)
   :
  File "/opt/python3.6.4/lib/python3.6/subprocess.py", line 1344, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
OSError: [Errno 8] Exec format error: '/vagrant_data/norilog/norilog.py'

あれまたなんか出た
これってshebangがついてないときに出るやつだよな
実行権限も(最初から)ついてるし
そもそも
pythonから呼び出してるんだし
スクリプト自体はもう起動してるわけだし
問題ないと思うんだけどなあ
本のコードにもshebangないし
でも一応shebangつけてみよう

(venv) vagrant@vagrant:/vagrant_data/norilog$ python norilog.py
 * Serving Flask app "norilog" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://0.0.0.0:8000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 163-066-465

なんで動くの
ブラウザからのアクセスも成功だし

・・・

“Restarting with stat”あたりで自分自身を実行しなおしてるのかな?
なくはないけど
pythonスクリプトだってわかってるときにシェル経由で実行するか?
どういうしくみ?

Dockerだけど似たような話があった

0.15.0 causes OSError: [Errno 8] Exec format error: in Docker for Windows · Issue #1482 · pallets/werkzeug · GitHub

最近shebangが必要になったらしい
発生するのはdebugモードだけ
たしかに

なおwerkzeugというのはWSGIのライブラリだそうである
WSGI(Web Server Gateway Interface)というのはPython
おけるWebサーバとWebアプリケーションの間の通信の標準なんだそうな

debugオプションにTrueを指定すると、アプリケーションでエラーが発生した際に、Webブラウザーで利用できるデバッガーが実行されます。

これのことだな
どんなふうになるんだろう
いろいろ調べてみたいけど進もう

おや
pythonのソースを修正するたびに読み込みなおしてるみたいだぞ
そんなことまでしてくれるのか
すごいけどvscodeオートセーブにしてるから半端なところでセーブして
読み込まれて止まってしまったよ
これつかうときはオートセーブ止めておいたほうがいいかも

LIST2.22
さっき見た正誤表にちょうど書いてあったとこなんだけど
requestのimportが足りてないのを知りつつ実行

ブラウザにスタックトレース出た
狙い通り

File "/vagrant_data/norilog/norilog.py", line 70, in save
start = request.form.get("start")
NameError: name 'request' is not defined

クリックするとソースを表示してくれたり
コンソールアイコンをクリックするとREPLが起動したり

requestがimportされてないんだからインポートしたらいいんじゃない?

[console ready]
>>> from flask import request
>>>

と思ったけどどうやったら実行再開するんだろう?
まあいいか

これでflask体験終了