Python と Web 開発を再検討しています。私は過去に Django を使用していましたが、しばらく経ちました。Flask + SqlAlchemy は私にとってまったく新しいものですが、それによって得られる制御が気に入っています。
はじめに; 以下のコードは、私の開発サーバーで魅力的に機能します。それでも、可能な限り小さく効率的ではないと感じています。誰かが同様のソリューションを構築したかどうか疑問に思っていました。今のところ、単一のクエリを使用してキーワード引数をフォーマットする方法を見つけようとしています。さらに、関数をより再利用可能にするために、関数の周りにクラスを構築すると役立つと思います。
日付に基づいてクエリを作成する関数は次のとおりです。
def live_post_filter(year=None, month=None, day=None):
""" Query to filter only published Posts exluding drafts
Takes additional arguments to filter by year, month and day
"""
live = Post.query.filter(Post.status == Post.LIVE_STATUS).order_by(Post.pub_date.desc())
if year and month and day:
queryset = live.filter(extract('year', Post.pub_date) == year,
extract('month', Post.pub_date) == month,
extract('day', Post.pub_date) == day).all()
elif year and month:
queryset = live.filter(extract('year', Post.pub_date) == year,
extract('month', Post.pub_date) == month).all()
elif year:
queryset = live.filter(extract('year', Post.pub_date) == year).all()
else:
queryset = live.all()
return queryset
ビューから上記の関数を呼び出す方法は次のとおりです。
@mod.route('/api/get_posts/', methods = ['GET'])
@mod.route('/api/get_posts/<year>/<month>/<day>/', methods = ['GET'])
@mod.route('/api/get_posts/<year>/<month>/', methods = ['GET'])
@mod.route('/api/get_posts/<year>/', methods = ['GET'])
def get_posts(year=None, month=None, day=None):
posts = live_post_filter(year=year, month=month, day=day)
postlist = []
if request.method == 'GET':
# do stuff
上で述べたように、これはすべて非常にぎこちなく感じます。アドバイスをいただければ幸いです。