Flaskでwebアプリケーション作る雑記(個人記録用)

雑なのはご勘弁ということで。
自分の開発チーム向けに書いてある意味も含んでます。
編集リクエストなど大喜びなので何かあったらください

---

# 使用環境・Package

* `Flask` -- 軽量なウェブアプリケーションプラットフォーム。
* `pytest` -- Pythonのテストフレームワークの一つ。
* `pipenv` -- 仮想環境構築のやつ（`pyenv`とか`venv`とか？）の一つ。
* `sqlalchemy` -- PythonからSQLを触る...のか...??
* `flask-sqlalchemy` -- Flaskから`sqlalchemy`を使いやすくする？
* `swagger` -- pythonではないが、`RESTfulAPI`の仕様書として使っている。

# Docstring

## Docstringとは

簡単に言ったら、形式化されたコメント？
ただし機構上も特殊。環境によっては、ドキュメントを直接参考できたりする。
Sphinx等でドキュメント生成が楽にできる。
ちなみに今回の開発チームでは**Googleスタイル**の方を選択させてもらいました。

## 主な流派

* Googleスタイル（横に長い）
* NumPyスタイル（縦に長い）

### Googleスタイルについて

```

"""ここから説明を開始できます。

   Args:
         引数1 (型名): 引数の説明
         引数2 (型名): 引数の説明
                 ...
   Return:
         戻り値1 (型名): 引数の説明
                 ...
"""
```

### Numpyスタイルについて

参考: [simonritchie/ [Python]可読性を上げるための、docstringの書き方を学ぶ（NumPyスタイル）](https://qiita.com/simonritchie/items/49e0813508cad4876b5a)

```

"""ここから説明を開始できます。

Parameters
----------
引数1 : 型名
　　引数の説明
引数2 : 型名
　　引数の説明
  ...

Returns
-------
戻り値1 : 型名
　　戻り値の説明
  ...
"""
```

# デコレーターとは

デコレーターとは、行頭に`@`から始まっているあれです。
Pythonのデコレーターは、他の言語でいうオーバーライドに近いような感じが（素人目線だと）しました。
役割は、直後に定義された関数を拡張することです。（多分）
その直後に定義されている関数の前後に機能を追加したりできます。

時間ないのでとりあえずこれわかりやすかったので投下
[mtb_beta  -- Pythonのデコレータについて](https://qiita.com/mtb_beta/items/d257519b018b8cd0cc2e)



# プチ知識的な

## 型名の確認

```py

type(your_thing_to_check)
```


# Flask

`Flask`は、軽量なウェブアプリケーションプラットフォーム~~らしい~~です。

## Flaskでテストする

Flaskでテストするとき、公式に`pytest`使われている([Testing Flask Applications](http://flask.pocoo.org/docs/1.0/testing/))ので`pytest`を使っています。
リンクは貼っておきますが、役に立つメゾット(?)たちを紹介。
尚、ここから先`client`は以下のソースで作成されたものとします

```py

# type(app)  ==> <Flask flask>(執筆途中)
client = app.test_client()
```

### client.get(url)

now writing...


# SQLAlchemy

公式サイト: [flask-sqlalchemy.pocoo.org](http://flask-sqlalchemy.pocoo.org/2.3/)
簡単な触り方についての読みやすそうなURLがあったので追加
https://torina.top/detail/214/

DB周りの設定方法etc:

* https://qiita.com/petitviolet/items/e03c67794c4e335b6706

# SQLite3

今回テスト用に使っているDBである。この記事は開発チームへの記録という面も持ち合わせて作られているため、pythonではないが取り上げる。
**SQLAlchemyでエラーが出たらSQL文を調べると解ける事がある（結局はSQLなので）**

## DBを作成する

## DB本体を作成

これは今回開発には関連がないが備忘録的意味も含め一応。
shellにて、`sqlite3 <db_name>`を実行すると、`<db_name>`という名前のDBができる。
そして対話モードに入る。

## テーブルの作成

基本

```sql

CREATE TABLE <table_name>(<arg_name> <type>, <arg_name2> <type>, ..)
```
`<table_name>`：　文字列。テーブルの名前。
`<arg_name>`: Columnの名前。
`<type>`: 型。型には以下のようなものがあるようです

```markdown

* `NULL`: Null
* `INTEGER`: 所謂Int型。符号付整数で1,2,3,4,6,8バイトで格納
* `TEXT`: 文字列型。`UTF-8`,`UTF-16BE`, `UTF-16-LE`で格納
* `REAL`: 8バイトの浮動小数点数
* `BLOB`: Binary Large Object。入力データをそのまま保持

```

参考:　https://www.dbonline.jp/sqlite/type/index1.html



尚今回は、以下のようなdbを作成したと仮定する

```sql:peoples.sqlite3
CREATE TABLE humam(
               first_name TEXT,
               last_name TEXT,
               age INTEGER)
```


## データの取得方法について(SELECT文)

基本文法：

```sql

SELECT hoge from db
```

取り出した値に別名をつけて表示

```sql

SELECT hoge as fugo from db
```
こうすると、`hoge`のColumnを`fugo`という名前で表示できる。
時間的アレもあり参考： https://www.dbonline.jp/sqlite/select/index8.html

条件付きで取り出す

```sql
SELECT hoge from db WHERE <>
```

参考: https://www.dbonline.jp/sqlite/select/index3.html


# swagger

`yaml`形式で書いていけるのだが、どういった書式なのかは[オンラインエディタ](https://editor.swagger.io/)をいろいろいじってみるとわかりやすい