初心者向けWEBアプリ開発のコツ(1)

実にくだらないけど、初心者なのでメモしています。

#ＧＩＴからのアプリ起動
まずはクローンを作って、次にVENVで仮想環境を作る
仮想環境を作ったら、SCRIPTS/BINの中にACTIVATEというバッチファイルがある
これを入れると、(VENV)というカーソルになって仮想環境に入る
あとはREQUIREMENTO.TXTというファイルがあって、これに必要なライブラリが入っているので、PIPでインストール
そしてRUNを実行する

```
git clone https://github.com/省略/ファイル名.git
cd ファイル名
python3 -m venv venv
source ./venv/bin/activate　→　ここ間違っているのではないか？
pip install -r requirements.txt
python3 ./run.py
```

#フォルダの構成

ざくっとアプリを見るときは，ＴＲＥＥコマンドで排出するといい。
flaskのアプリは、ちょっと大規模になってくると、app階層化をした方が良さそう
＿init＿というのが、フォルダで階層化されたときに、イニシャライズされるみたいだ

PYTHONって、そもそもフォルダ自体が、名前を持ったオブジェクトになっている。
これらはすべて、IMPORTすることで、別のモジュールに関数として組み込まれる。（モジュール自体をプログラムとして動作したい場合、例のおまじない＿main＿を使う）

機能を関数にして、その中にview.pyとmodel.pyを置いている
テンプレートは、各関数の直下に置かれている
これをBLUEPRINTという関数で、ひとつにまとめて、親アプリ化している。
→つまりは、子アプリで開発して、それを上に束ねていくイメージ

```
C:.
│  .gitignore
│  app.db
│  config.py
│  folder.txt
│  LICENSE
│  README.md
│  requirements.txt
│  run.py
│  
├─app
│  │  db_fill.py
│  │  models.py
│  │  __init__.py
│  ├─api
│  │  │  book.py
│  │  │  comment.py
│  │  │  fields.py
│  │  │  log.py
│  │  │  tag.py
│  │  │  user.py
│  │  │  __init__.py           
│  ├─main
│  │  │  decorators.py
│  │  │  errors.py
│  │  │  __init__.py
│  │  ├─auth
│  │  │  │  forms.py
│  │  │  │  views.py
│  │  │  │  __init__.py
│  │  │  ├─templates
│  │  │  │      login.html
│  │  │  │      register.html        
│  │  ├─comment
│  │  │  │  forms.py
│  │  │  │  views.py
│  │  │  │  __init__.py
│  │  ├─index
│  │  │  │  views.py
│  │  │  │  __init__.py
│  │  │  ├─templates
│  │  │  │      index.html
│  │  ├─log
│  │  │  │  views.py
│  │  │  │  __init__.py
│  │  │  ├─templates
│  │  │  │      logs_info.html
│  │  ├─user
│  │  │  │  forms.py
│  │  │  │  views.py
│  │  │  │  __init__.py
│  │  │  ├─templates
│  │  │  │      user.html
│  │  │  │      省略
│  ├─static
│  │  ├─css
│  │  │      bootstrap-theme.css
│  │  │      省略
│  │  │      tokenfield-typeahead.min.css
│  │  ├─fonts
│  │  │      glyphicons-halflings-regular.eot
│  │  │      省略
│  │  ├─img
│  │  │      logo.png
│  │  │      省略
│  │  └─js
│  │          bootstrap-tokenfield.js
│  ├─templates
│  │      404.html
```

#ユーザー認識、ログイン関連

WEBアプリにおける、ややこしい部分を分かりやすく説明する

###cookie
クッキーを分かりやすく説明すると、病院の診察券を考えるといいだろう。

患者は病院に行き診察券を預け、病院側は診察券によってカルテを用意したり、待合室への案内を行う。

もしも診察券が無かったら、患者を間違えたり、大変な医療ミスが発生することになる。


```
def index():
    response = make_response(HTMLのテキストデータ)
    response.set_cookie(キーワード=値、．．．)
    return response
```
サーバーからのレスポンスは、ヘッダとHTML本体があり、
cookieはヘッダに書かれる単なるテキストだ。

これは勝手にクライアント側のブラウザに書き込まれて、
次にアクセスすると、リクエストのヘッダの中に、知らぬ間に書かれている
（おそろしや。。。）

```
def foo():
    uid = request.cookies.get('uid', None)
```

クッキーは辞書型になっていて、こんな感じでＩＤや名前やパスワードなんかを
やりとりすることができる。

##SESSION

もう一つややこしいものに、SESSIONというのがある。

これはお店側が、やってきた客に対して発行するレシートのようなものだ。
たいていのお店は、レシートを持ってこないと返品には応じないだろう。
お店側も、レシートさえ提示してもらえば、それなりにサービス対応ができる。

```

app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'

from flask import session →　sessionはオブジェクト
 
def index():
    check = session.get('key')
    ログインしているかを判定する処理を書く

def login():
　　session['key'] = value　→リクエストヘッダなどの値、フォームのＩＤなど
    
def logout():
    session.pop('key', None)　→　破棄する
```

##COOKIEとSESSION

両者の使い分けは下記である。

・COOKIEのパーミッションは、ユーザー側が持っている
・SESSIONのパーミッションは、お店側が持っている。

SESSIONを使うことで、お店側から入場時間などの制限をかけることができる。
お店側で暗号化されているので、ユーザー側では容易に複製できない。
例）イコカの有効期限

COOKIEを使うことで、お客さんを個別に認識できる。
例）病院の診察券


##まとめ
こんな感じで、自分が得た知識を、ブログに書くことで整理することも大事
まずは見様見まねで、ベテランのソースを読み解くことから始めている。
（つづく）