PPP3: こんどこそFlask
Pythonのコードも手で入れていくよ
こういうところは決まった書式なんだろうか
"""
:param start: 乗った駅
:type start: str
"""
あとで説明されるSphinx + reStructuredTextの形式ってことかな
この形式でもmypyが型をチェックしてくれたりするのかな
・・・
どうやらこのへんの書き方はけっこうユルくていろんな流儀があるみたい
ということはmypyが見てくれたりはなさそうだ
今なら型ヒントつけるのが正しそう
save_data
とload_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だけど似たような話があった
最近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体験終了