Pythonでデータの読み書きが可能なwebサイトを実装する際の開発環境、ライブラリについて
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 898
前提・実現したいこと
Pythonでデータの読み書きが可能なwebサイトを実装しようとしています。
開発環境をFlaskかBottleどちらにするべきか、またSQLAlchemyを使うかどうか、判断ができず、アドバイスをいただけましたら幸いです。
当初、データの読み書きが可能なwebサイトを実装するために以下の記事を参考にFlaskとSQLite、SQLAlchemyを用いての実装を考えておりました。
参考記事
『Pythonエンジニア養成読本』の5章(入門Webアプリケーション開発)の書籍管理アプリケーションのサンプルソースを見つけました。こちらはBottle,SQLAlchemy,bottle-sqlalchemy,WTFormsを使用しているそうです。
Githubのコード
該当のソースコード
上記Githubより
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from datetime import datetime
import bottle
from bottle import get, post, run
from bottle import request, template, redirect
from bottle import HTTPError
from sqlalchemy import create_engine, Column, Integer, Unicode, DateTime, UnicodeText
from sqlalchemy.ext.declarative import declarative_base
from bottle.ext import sqlalchemy
from wtforms.form import Form
from wtforms import validators
from wtforms import StringField, IntegerField, TextAreaField
Base = declarative_base()
engine = create_engine('sqlite:///:memory:', echo=True)
# bottle-sqlalchemyの設定
plugin = sqlalchemy.Plugin(
engine,
Base.metadata,
keyword='db', # 関数内で挿入される場合の変数名
create=True, # テーブルを作成するか
commit=True, # 関数終了時にコミットするか
use_kwargs=False
)
# プラグインのインストール
bottle.install(plugin)
class Book(Base):
# booksテーブル
__tablename__ = 'books'
# カラムの定義
id = Column(Integer, primary_key=True)
title = Column(Unicode(100), nullable=False)
price = Column(Integer, nullable=False)
memo = Column(UnicodeText)
created_at = Column(DateTime, default=datetime.now)
def __repr__(self):
return "<Book('%s','%s', '%s', '%s')>" % (self.title, self.price, self.memo, self.created_at)
class BookForm(Form):
title = StringField(u'タイトル', [
validators.required(message=u"入力してください"),
validators.length(min=1, max=100, message=u"100文字以下で入力してください")
])
price = IntegerField(u'価格', [
validators.required(message=u"数値で入力してください")
])
memo = TextAreaField(u'メモ', [
validators.required(message=u"入力してください")
])
@get('/')
def top(db):
redirect("/books")
@get('/books')
def index(db):
# booksテーブルから全件取得
books = db.query(Book).all()
# index.tplの描画
return template('index', books=books, request=request)
@get('/books/add')
def new(db):
form = BookForm()
# add.tplの描画
return template('edit', form=form, request=request)
@post('/books/add')
def create(db):
form = BookForm(request.forms.decode())
# フォームのバリデーション
if form.validate():
# Bookインスタンスの作成
book = Book(
title=form.title.data,
price=form.price.data,
memo=form.memo.data
)
# bookを保存
db.add(book)
# 一覧画面へリダイレクト
redirect("/books")
else:
return template('edit', form=form, request=request)
@get('/books/<id:int>/edit')
def edit(db, id):
# Bookの検索
book = db.query(Book).get(id)
# Bookが存在しない(404を表示)
if not book:
return HTTPError(404, 'Book is not found.')
# フォームを作成
form = BookForm(request.POST, book)
# edit.tplを描画
return template('edit', book=book, form=form, request=request)
@post('/books/<id:int>/edit')
def update(db, id):
# Bookの検索
book = db.query(Book).get(id)
# Bookが存在しない(404を表示)
if not book:
return HTTPError(404, 'Book is not found.')
form = BookForm(request.forms.decode())
if form.validate():
# book情報を更新
book.title = form.title.data
book.price = form.price.data
book.memo = form.memo.data
# 一覧画面へリダイレクト
redirect("/books")
else:
return template('edit', form=form, request=request)
@post('/books/<id:int>/delete')
def destroy(db, id):
# Bookの検索
book = db.query(Book).get(id)
# Bookが存在しない(404を表示)
if not book:
return HTTPError(404, 'Book is not found.')
# bookを削除
db.delete(book)
# 一覧画面へリダイレクト
redirect("/books")
if __name__ == '__main__':
run(host='localhost', port=8080, debug=True, reloader=True)
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
FlaskかBottle限定でしょうか?
Djangoならフルスタックなのですべてそろっています。
Djangoの提供する機能でデータの読み書きや、はてはフォームの生成もしてくれたりします。
SQLiteやMySQL、PostgreSQLも使えるようです。
日本語ドキュメントも今では結構増えてきているのでおすすめです。
ただ、一つのことをやるのにも結構回りくどいことをする印象なので、小規模なアプリ開発には向かないかもしれません。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 89.96%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/12/03 07:49
Webアプリケーションフレームワークに関してはHTML/CSS, JavaScript程度しか知らず、全くの初心者で小規模なアプリ開発を予定しています。この場合はFlaskかBottleのどちらが簡単でオススメでしょうか。アドバイスをいただけますと幸いです。
2017/12/03 10:40
Bottleはなんと1ファイルで構成されています。なので取り回しも良いですし、ソースコードのトレースもしやすいです。
デコレーターでURLをビューにくっつけられるので直感的で、小規模のものにはたいへん向いています。
実はflaskもそんなに難しいというわけではなく拡張モジュールも豊富ですし日本語ドキュメントも結構転がっています。どちらを使ってもフレームワークとしての難易度はそこまで変わらないと思います。
難しいのはWebフレームワークのMVCやMVTといった概念の方かと思います。
あとはデータベースとのやり取りをするのであれば当然データベースの知識が必要になります。
SQLAlchemyは生のSQLクエリではなく、もっとPythonライクにデータベースとのやり取りが出来るものですが、その文SQLAlchmy自体の使い方を学習する必要があります。
生クエリ発行するだけで十分なのであればmysql-connector-pythonとかでもいいと思います。
BottleもFlaskも自前でWebサーバ立ち上げられるので、開発段階では特に問題ではないですが、
一番難しいのはサーバーで実際に稼働させることだと思います。
(herokuにデプロイするならそこまで難しくはないです)