Day6 おもろくなってきたぜい!!

How To Become A Hacker: Japanese

class IndexView(LoginRequiredMixin, View):
    def get(self, request, *args, **kwargs):
        queryset = Book.objects.select_related('publisher').prefetch_related('authors').order_by('publish_date')
        keyword = request.GET.get('keyword')
        if keyword:
            queryset = queryset.filter(
                Q(title__icontains=keyword) | Q(description__icontains=keyword)
            )
        context = {
            'keyword': keyword,
            'book_list': queryset,
        }
        return render(request, 'shop/book_list.html', context)


index = IndexView.as_view()


class DetailView(LoginRequiredMixin, View):
    def get(self, request, book_id, *args, **kwargs):
        book = Book.objects.get(pk=book_id)
        context = {
            'book': book,
            'stripe_pub_key': settings.STRIPE_PUBLISHABLE_KEY,
        }
        return render(request, 'shop/book_detail.html', context)


detail = DetailView.as_view()

・.select_related関数/.prefetch_related関数
クエリを飛ばしすぎることを防ぐためにするらしい。ちょっとまだわからないからざっくりと覚えておく。
上記二つに関しては以下参照。
Django ORM の select_related, prefetch_related の挙動を詳しく調べてみた - akiyoko blog


・Qオブジェクト.......検索フォームをつくる時に使用することが多いらしい。モデルのデータの中からOR検索する時に使われるらしい。
Qオブジェクトの使い方を解説【具体的なコード付き】 - code for Django

class CheckoutView(LoginRequiredMixin, View):
    def post(self, request, *args, **kwargs):
        import time
        start_time = time.time()
        logger.info("User({}) posted the form.".format(request.user.id))

        stripe.api_key = settings.STRIPE_API_KEY
        token = request.POST['stripeToken']
        item_id = request.POST['item_id']
        book = get_object_or_404(Book, pk=item_id)

        try:
            charge = stripe.Charge.create(
                amount=book.price,
                currency='jpy',
                source=token,
                description=book.title,
            )
        except stripe.error.CardError as e:
            # The card has been declined
            return render(request, 'error.html', {
                'message': "Your payment cannot be completed. The card has been declined.",
            })

        logger.info("Charge[{}] created successfully.".format(charge.id))
        messages.info(request, "Your payment has been completed successfully.")
        logger.debug("Finished in {:.2f} secs.".format(time.time() - start_time))
        return render(request, 'shop/complete.html', {
            'charge': charge,
        })


checkout = CheckoutView.as_view()


・import time を関数の中に書けることを初めて知った。
・time.time()....現在時刻を取得。returnの単位が秒かつ浮動小数点。


まず、ログとは、プログラムの実行中に起こった出来事の記録。loggingとはログを出力すること。
そして、ログレベルというものがある。そのうちのものがinfoとdebug。

・logger.info()....正常動作の記録
・logger.debug()........動作確認などデバッグの記録
【Python入門】loggingモジュールで処理の記録を残してみよう! | 侍エンジニアブログ

・try: except文......pythonの例外処理や。これは、知ってたけど、今回の写経回初めてで重要だと思ったからログを残しておこうと思った。


今日のソースコード元は以下です。ありがとうございます!
django-book-mysite-sample/views.py at master · akiyoko/django-book-mysite-sample · GitHub

今日は以上!