学生向けプログラミング入門 | 無料

学生向けにプログラミングを無料で解説。Java、C++、Ruby、PHP、データベース、Ruby on Rails, Python, Django

Django3.2 | 45 | QRオーダーシステムの構築 | デプロイ準備

[44 | Heroku設定] << [ホーム] >> [46 | デプロイ]

「qrmenu_server」側で作業します。


「heroku CLI」をインストールします。
コマンド
brew tap heroku/brew && brew install heroku


xcodeのバージョンが古い場合、以下のようなエラーが出ます。

==> Installing heroku from heroku/brew
Error: Your Command Line Tools are too outdated.
Update them from Software Update in System Settings.

If that doesn't show you any updates, run:
  sudo rm -rf /Library/Developer/CommandLineTools
  sudo xcode-select --install

Alternatively, manually download them from:
  https://developer.apple.com/download/all/.
You should download the Command Line Tools for Xcode 14.3.



このエラーの通り、まずsudo rm -rf /Library/Developer/CommandLineToolsとコマンドを打ち、古いライブラリを削除します。
次にsudo xcode-select --installとタイプし、xcodeのインストールをやり直します。
そうすることでherokuCLIをインストールできるようになります。


バージョン確認します。
コマンド
xcode-select --version

~/Desktop/QRMenu/qrmenu_react $ xcode-select --version 
xcode-select version 2397.



「qrmenu_react」側で作業します。


今までに作成した「qrmenu_react」をビルドします。
新しく「build」フォルダが作成されます。
コマンド
npm run build


「qrmenu_server」側の「/qrmenu_server/qrmenucore」フォルダに新しく「templates」フォルダを作成します。
作成した「qrmenu_server/qrmenucore/templates」フォルダにビルドで作成された「qrmenu_react/build/index.html」ファイルをコピーします。

ファイルをコピー
ファイルをコピー



「qrmenu_server/qrmenucore/views.py」ファイルを編集します。


記述編集 【Desktop/QRMenu/qrmenu_server/qrmenucore/views.py】

import json
import stripe

from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from django.conf import settings
from django.shortcuts import render

from rest_framework import generics
from . import models, serializers, permissions

# Create your views here.
class PlaceList(generics.ListCreateAPIView):
    serializer_class = serializers.PlaceSerializer

    def get_queryset(self):
        return models.Place.objects.filter(owner_id=self.request.user.id)
    
    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)

class PlaceDetail(generics.RetrieveUpdateDestroyAPIView):
    permission_classes = [permissions.IsOwnerOrReadOnly]
    serializer_class = serializers.PlaceDetailSerializer
    queryset = models.Place.objects.all()

class CategoryList(generics.CreateAPIView):
     permission_classes = [permissions.PlaceOwnerOrReadOnly]
     serializer_class = serializers.CategorySerializer

class CategoryDetail(generics.UpdateAPIView, generics.DestroyAPIView):
    permission_classes = [permissions.PlaceOwnerOrReadOnly]
    serializer_class = serializers.CategorySerializer
    queryset = models.Category.objects.all()

class MenuItemList(generics.CreateAPIView):
     permission_classes = [permissions.PlaceOwnerOrReadOnly]
     serializer_class = serializers.MenuItemSerializer

class MenuItemDetail(generics.UpdateAPIView, generics.DestroyAPIView):
    permission_classes = [permissions.PlaceOwnerOrReadOnly]
    serializer_class = serializers.MenuItemSerializer
    queryset = models.MenuItem.objects.all()

def home(request):
    return render(request, 'index.html')

stripe.api_key = settings.STRIPE_API_SECRET_KEY

@csrf_exempt
def create_pyment_intent(request):
   try:
        data = json.loads(request.body)
        intent = stripe.PaymentIntent.create(
            amount = data['amount'],
            currency = 'jpy',
            payment_method = data['payment_method']['id'],
            off_session=True,
            confirm = True,
        )

        order = models.Order.objects.create(
            place_id = data['place'],
            table = data['table'],
            detail = json.dumps(data['detail']),
            amount = data['amount'],
            payment_intent = intent['id']
        )

        return JsonResponse({
            "success": True,
            "order": order.id,
        })

   except Exception as e:
        return JsonResponse({
            "success": False,
            "error": str(e),
        })

class OrderList(generics.ListAPIView):
    serializer_class = serializers.OrderSerializer

    def get_queryset(self):
        return models.Order.objects.filter(place__owner_id=self.request.user.id, place_id=self.request.GET.get('place'))

class OrderDetail(generics.UpdateAPIView):
    permission_classes = [permissions.PlaceOwnerOrReadOnly]
    serializer_class = serializers.OrderSerializer
    queryset = models.Order.objects.all()    



「qrmenu_server/qrmenu_server/urls.py」ファイルにパスの設定を追加します。


記述追加 【Desktop/QRMenu/qrmenu_server/qrmenu_server/urls.py】

from django.contrib import admin
from django.urls import path, include, re_path

from qrmenucore import views

urlpatterns = [
    path('admin/', admin.site.urls),

    path('auth/', include('djoser.urls')),
    path('auth/', include('djoser.urls.authtoken')),

    path('api/places/', views.PlaceList.as_view()),
    path('api/places/<pk>', views.PlaceDetail.as_view()),

    path('api/categories/', views.CategoryList.as_view()),
    path('api/categories/<pk>', views.CategoryDetail.as_view()),

    path('api/menu_items/', views.MenuItemList.as_view()),
    path('api/menu_items/<pk>', views.MenuItemDetail.as_view()),

    path('api/create_payment_intent/', views.create_pyment_intent),

    path('api/orders/', views.OrderList.as_view()),
    path('api/orders/<pk>', views.OrderDetail.as_view()),

    re_path('', views.home),
]



↓↓クリックして頂けると励みになります。


[44 | Heroku設定] << [ホーム] >> [46 | デプロイ]