Pythonで簡単な掲示板を作成する。（FlaskとSQLを使ったWebアプリ開発入門）#1

#Pythonでwebアプリを作る
プログラミングに何となく興味を持って勉強して文法を覚えたりなど、いろいろと手を付けて勉強してみたはいいが、じゃあそれを活用するには何をすればいいのだろう？
そのように状況に陥る人がたくさんいると思います。
InstagramやTwitterのクローンを作るなどの学習方法もありますが、作るうえではデータベースなどの知識も絡んでくるので正直しんどいです。
ここでは最低限のデータベース機能と、簡単なWebアプリ開発に用いるFlaskを利用して簡単な掲示板をつくります。


#実装環境
- Window10 Home 64bit
- Python 3.6.4 |Anaconda, Inc.

#ライブラリ
Flask==1.0.2
Flask-SQLAlchemy==2.3.2
Jinja2==2.10
SQLAlchemy==1.2.15
sqlite3（恐らく標準）

#データベースについて
データベースではは表形式で管理されるデータを扱います。ここで作る掲示板は最小限にとどめるためこのような構成にします。

| id | 日付 | 名前 |  文章  |
|:---|-----:|:---:|:---------:|
| 1  | date1|   name1    |  text1 |
| 2  | date2  |  name2    |   text２  |


#使用するデータベース
ここではPythonで簡単に扱えるSqlite3を使います。


#Flask
###アプリの立ち上げ

```python:app.py
from flask import Flask, render_template

app = Flask(__name__)


@app.route("/")
def bbs():
    message = "Hello"
    return render_template("index.html", message = message)

if __name__ == "__main__":
    app.run(debug=True)
```

このプログラムを実行する以下のような文字列が出力されると思います。

```
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 583-549-282
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
```

[http://127.0.0.1:5000/](http://127.0.0.1:5000/)でブラウザを開くとこのような表示が出ます。

![2019-01-16.png](https://qiita-image-store.s3.amazonaws.com/0/285306/1def6c16-ce91-93c2-fdde-2b337c7619fe.png)

これでアプリの立ち上げはできました。

#Flask-SQLAlchemy
[公式チュートリアル](http://flask-sqlalchemy.pocoo.org/2.3/quickstart/)を参考にします。

SQLAlchemyではデータベースの操作をオブジェクト指向のように扱います

```python:app.py
class Article(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    pub_date = db.Column(db.DateTime, nullable=False,
                                default=datetime.utcnow)
    name = db.Column(db.Text())
    article = db.Column(db.Text())
```

pythonのterminalで以下のようなコマンドを実行するとデータベースが作成されます。

```
>>> from app import db
>>> db.create_all()
>>>
```

#実装してみる
html部分を含むソースは[こちら](https://github.com/tomson784/bbs)にあります。

```python:app.py
from flask import Flask, request, render_template
from datetime import datetime
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)

db_uri = 'sqlite:///test.db'
app.config['SQLALCHEMY_DATABASE_URI'] = db_uri
db = SQLAlchemy(app)

class Article(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    pub_date = db.Column(db.DateTime, nullable=False,
                                default=datetime.utcnow)
    name = db.Column(db.Text())
    article = db.Column(db.Text())

@app.route("/")
def bbs():
    text = Article.query.all()
    return render_template("index.html", lines = text)

@app.route("/result", methods=["POST"])
def result():
    date = datetime.now()
    article = request.form["article"]
    name = request.form["name"]
    admin = Article(pub_date=date, name=name, article=article)
    db.session.add(admin)
    db.session.commit()
    return render_template("bbs_result.html", article=article, name=name, now=date)

if __name__ == "__main__":
    app.run(debug=True)
```

これで掲示板と同じような動きをするwebアプリの完成です。

![2019-01-19.png](https://qiita-image-store.s3.amazonaws.com/0/285306/a215b827-f86f-fc0a-f516-1ec3729a9ba3.png)


次回はスレッド付きの掲示板の作り方とデプロイする方法について書きます。
[Pythonで簡単な掲示板を作成する。（FlaskとSQLを使ったWebアプリ開発入門）#2](https://qiita.com/tomson784/items/ed9542496ff46fd09d27)