DjangoでECアプリの構築 | Djangoのご紹介 (パート1)

 2021年07月08日

DjangoでECアプリの構築 |  Djangoのご紹介 (パート1)

1. はじめに



Pythonは、テクノロジーの世界で非常に人気のあるプログラミング言語として知られています。 1980年代後半に生まれ、この言語の父と見なされているモンティパイソンにちなんで名付けられました。 Pythonを使用したWebプログラミングは、すぐにプログラマーに人気がありました。 Pythonプログラミング言語のWebデザインに特化したアプリケーションであるDjango– WebFrameworkを学ぶ傾向はますます一般的になっています。

次に、Djangoフレームワークをご紹介します。

 

2. Djangoの概要


DjangoはPythonプログラミング言語で書かれた高レベルのWebプログラミングフレームワークです。

Djangoは高速でシンプルなので、すぐにWebプログラミングを行うことができます。 さらに、Djangoには非常に優れたドキュメントがあり、Djangoコミュニティは大きく強力です。

他のフレームワークはこれを真剣に受け止めていませんが、それはDRYの原則に従います(自分自身を繰り返さないでください-自分自身を繰り返さないでください)。 DjangoはORM(Object Relistic Mapping)もサポートしています。

MTVパターン:

  •  Djangoは、MVC(Model-View-Controller)モデルではなく、MTV(Model-Template-View)モデルに従います。
  •  このモデルは、ユーザーと対話するアプリケーションを作成するときに使用されます。
  •  このモデルには、DJangoテンプレート言語(DTL)を使用したHTMLコードが含まれています
  •  ビュー(MVCのコントローラーに対応)は、モデルとテンプレート間の相互作用を制御するために記述されたコードです。つまり、クライアントからサーバーにリクエストを送信し、サーバーからクライアントに結果を返します。

Djangoをコーディングするには、Pythonをインストールできる必要があります。

 

3. プロジェクトの初期化


 最初に行うことは、プロジェクトを開発するための仮想環境をインストールすることです。virtualenvからpipenvまでこれを実行できる多くのPythonライブラリがあります。 便宜上、私は常にpipenvを使用してインストールをデプロイします。 コマンドpip3installpipenvを実行します

次に、プロジェクトを含むフォルダーを作成し、仮想環境を実行します。

$ mkdir GreatKart && cd GreatKart#プロジェクトコードを含むフォルダー

$ pipenv install Django#Django == 3.2

$ pipenvシェル

この時点で、コマンドラインの形式は(GreatKart)... $です。つまり、GreatKartの仮想環境にいます。

コマンドdjan​​go-adminstartproject greatkartを使用してコードプロジェクトを作成します。このコマンドは、最初のDjangoプロジェクトに必要なすべてのコードを生成します。を追加します。 最後に、それは通常とは少し異なります。

(GreatKart)...$ python3 manage.py migrate

(GreatKart)...$ python3 manage.py runserver

プロジェクトディレクトリ構造:

---GreatKart

|---greatkart (folder)

|---manage.py

|---db.sqlite3

|---Pipfile

|---Pipfile.lock

|---requirements.txt

|---.gitignore

4. MySQLに接続


すべてのWeb開発フレームワークには、ユーザーデータを管理するためのデータベースが必要です。 GreatKart / greatkart / settings.pyファイルを一瞥し、[データベース]セクションまで下にスクロールします。

DATABASES = {

'default': {

'ENGINE': 'django.db.backends.sqlite3',

'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), }

ここでは、デフォルトでDjangoがsqlite3データベース管理システムを使用しているため、上記のmigrateコマンドを実行すると、コードフォルダーによってファイルGreatKart /db.sqlite3が自動的に作成されます。 Djangoはsqlとnosqlの両方で多くの一般的なデータベース管理システムをサポートしているので、私は常にsqlite3の代わりにMySQLをデータベース管理システムとして使用します。

MySQLを使用するには、MySQLをインストールできます。FLUSHPRIVILEGESステップを実行するだけです。 さらに、インターフェースによるMySQL管理を容易にするために、MySQLWorkbenchをインストールすることもできます。 また、Pythonがコマンドpip3 install mysqlclientを使用してMySQlに接続できるように、mysqlclientライブラリをインストールする必要もあります。

ettings.pyファイルのDATABASESコードを少し編集します。

DATABASES = { 'default': {

'ENGINE': "django.db.backends.mysql",

'HOST': "localhost",

'NAME': "GreatKart",

'USER': "root",

'PASSWORD': "12345678", }

それはそれだコマンドラインがエラーを与えていない場合は、我々が正常に接続している、あなたは再度コマンドのpython3 manage.py移行を実行して、今、あなたはdb.sqlite3ファイルを削除することができます。

このようにデータベース名とパスワードをあまりにも明らかにされたまま、私たちはこの後や他のもののような個人的な事を明らかにしないためにENV変数を作成する必要があります。 インストールするPythonライブラリの後にdjango-environが続き、次の内容でmanage.pyと同じレベルに.envファイルを作成します。

SECRET_KEY= ... # SECRET_KEY trong file settings.py

DATABASE_ENGINE=django.db.backends.mysql

DATABASE_NAME=GreatKart

DATABASE_USER=root

DATABASE_PASSWORD=12345678

DATABASE_HOST=localhost

DATABASE_PORT=3306

TIME_ZONE=Asia/

LANGUAGE_CODE=vi

settings.pyファイルでは、追加する必要があります。

#上がるには

import environ

env = environ.Env(

DEBUG=(bool, False)

environ.Env.read_env()

そして、次のenvファイルから対応するものを置き換える必要があります。

SECRET_KEY = env("SECRET_KEY")

DATABASES = {

"default": {

"ENGINE": env("DATABASE_ENGINE"),

"NAME": env("DATABASE_NAME"),

"USER": env("DATABASE_USER"),

"PASSWORD": env("DATABASE_PASSWORD"),

"HOST": env("DATABASE_HOST"),

"PORT": env("DATABASE_PORT"),

LANGUAGE_CODE = env("LANGUAGE_CODE")

TIME_ZONE = env("TIME_ZONE")

上記のようにmigrateコマンドとrunserverコマンドを再度実行します。エラーがなければ問題ありません。

5. プロジェクト用のDocker


パート1でexitコマンドを使用して仮想環境を終了し、Dockerfileとdocker-compose.ymlの2つのファイルを作成します。

$ touch Dockerfile

$ touch docker-compose.yml

Dockerfileファイルの内容は次のとおりです。

# Pull base image

FROM python:3.7

# Set environmental variables

ENV PYTHONDONTWRITEBYTECODE 1

ENV PYTHONUNBUFFERED 1

# Set work directory

WORKDIR /code

# Install dependencies

COPY Pipfile Pipfile.lock requirements.txt /code/

RUN pip3 install pipenv && pipenv install --system && pip3 install -r requirements.txt

# Copy project

COPY .env /code/

COPY . /code/

docker-compose.ymlファイルの内容は次のとおりです。

version: '3'

services:

web:

build: .

command: python3 /code/manage.py runserver 0.0.0.0:8000

volumes:

- .:/code

ports:

- 8000:8000

depends_on:

- db

env_file:

- .env

db:

image: mysql:8.0.20

restart: always

command: --default-authentication-plugin=mysql_native_password --mysqlx=0

environment:

MYSQL_DATABASE: GreatKart

MYSQL_USER: root

MYSQL_PASSWORD: 12345678

MYSQL_ROOT_PASSWORD: 12345678

volumes:

- ".dbdata:/var/lib/mysql"

ports:

- '3305:3306'

env_file:

.env

このdocker-compose.ymlファイルでは、web(Webアプリケーションを実行するため)とdb(MySQLデータベース部分を実行するため)の2つのコンテナーを作成します。

depends_onの値はデータベースコンテナ(db)名でなければならないことに注意してください。 mysql:8.0.20という名前のイメージを含むdbコンテナでは、つまり、マシンのMySQlのバージョンである必要があり、-。db ...で始まるボリューム値もコンテナ名に対応している必要があります。これは、設定する必要のあるポート値です。 {x} / 3306(ポートの重複を避けるためにxは3306ではありません)。 環境変数を使用しているため、両方のコンテナーの値はenv_fileである必要があります

さらに、.envファイルでは、DATABASE_HOST = localhostの値をDATABASE_HOST = db(dbコンテナー名)に変更する必要もあります。

Dockerを実行するには、次のコマンドを実行します。

$ sudo docker build .

$ sudo docker-compose build

$ sudo docker-compose up

この時点で、我々はもうパート1のように実行できるようにするには、仮想環境(pipevシェル)を入力することなく、ドッキングウィンドウを使用してWebを実行しています。

 

6. 静的およびメディア設定


Djangoの静的ディレクトリは、静的フォルダとファイルが保存される場所です。 含まれるもの:CSSフォルダ、javascipt、フォントおよびウェブサイトのための固定イメージファイルを。

さらに、ブートストラップ4で使用するために必要なファイルもダウンロードしました。静的で使用したくない場合は、django-bootstrap4ライブラリを使用できます。 静的フォルダに必要なコードはここにあります。すぐに使用できるようにダウンロードできます。

次に、settings.pyファイルに移動して、Djangoに静的ディレクトリを認識させる次のコードを追加します。

STATIC_URL = '/static/'

STATIC_ROOT = BASE_DIR / 'static'

STATICFILES_DIRS = [

'greatkart/static']

ここで、STATIC_URLとSTATIC_ROOTは、Djangoがデプロイ時にcollectstatic管理コマンドを介して静的ファイルを保存する場所です。 STATICFILES_DIRSを使用して、Djangoがすべての静的ファイルを調べてアーカイブにロードできるようにします

上でダウンロードした静的フォルダーは、settings.pyファイルと同じレベルのgreatkartサブディレクトリにあります。 次に、コマンドpython3 manager.py collectstaticを実行すると、DjangoはSTATIC_URL変数と同じパスでgreatkartディレクトリと同じレベルのディレクトリを作成します。

後で静的ディレクトリを変更する場合は、settings.pyと同じレベルで静的ディレクトリを編集してから、collectstaticコマンドを再度実行して新しい静的ディレクトリを初期化する必要があります。

メディアは、画像やビデオなどのメディアタイプのファイルを格納するフォルダです。 そこから、サーバーはアクセスして追加、編集、削除できます。 メディアを次のように構成します。

MEDIA_URL = '/media/'

MEDIA_ROOT = BASE_DIR / 'media'

今回は他に何もする必要はありません。 アクセスコマンドがある場合、DjangoはMediaフォルダーを探すか、存在しない場合は作成します。

 

7. ユーザーモデル、カテゴリ、製品モデルのカスタマイズ


Djangoでは、このフレームワークはuserという名前のユーザーのデフォルトモデルを作成しました。 このデフォルトは開発者の要件を制限することが多いため、そこから関数をカスタマイズして継承する必要があります。

コマンドpython3manager.py startappaccountsを使用してaccountsという名前の新しいアプリを作成し、settings.pyファイルのINSTALLED_APPS配列変数に「accounts」を追加し、Djangoに通知する新しい変数AUTH_USER_MODEL = 'accounts.Account'を追加します。デフォルトのユーザーモデルを使用しなくなりましたが、代わりにアカウントを使用します

次のクラスをaccounts / model.pyファイルに追加します。

class Account(AbstractBaseUser):

first_name = models.CharField(max_length=50)

last_name = models.CharField(max_length=50)

username = models.CharField(max_length=50, unique=True)

email = models.EmailField(max_length=100, unique=True)

phone_number = models.CharField(max_length=50)

# required

date_joined = models.DateTimeField(auto_now_add=True)

last_login = models.DateTimeField(auto_now_add=True)

is_admin = models.BooleanField(default=False)

is_staff = models.BooleanField(default=False)

is_active = models.BooleanField(default=False)

is_superadmin = models.BooleanField(default=False)

USERNAME_FIELD = 'email' REQUIRED_FIELDS = ['username', 'first_name', 'last_name']

objects = MyAccountManager()

def __str__(self):

return self.email

def has_perm(self, perm, obj=None):

return self.is_admin

def has_module_perms(self, add_label):

return True

新しいテーブルアカウントに必要なフィールドに関する情報、機能を理解するためにみんなの隣にコメントしました。

ユーザー操作を管理するために、追加のクラスMyAccountManagerを作成しました。

class MyAccountManager(BaseUserManager):

def create_user(self, first_name, last_name, username, email, password=None):

if not email:

raise ValueError('Email address is required')

if not username:

raise ValueError('User name is required')

user = self.model(

email=self.normalize_email(email=email),

username=username,

first_name=first_name,

last_name=last_name,

user.set_password(password)

user.save(using=self._db)

return user

def create_superuser(self, first_name, last_name, email, username, password):

user = self.create_user(

email=self.normalize_email(email=email),

username=username,

password=password,

first_name=first_name,

last_name=last_name, )

user.is_admin = True

user.is_active = True

user.is_staff = True

user.is_superadmin = True

user.save(using=self._db)

return user

コマンドpython3manager.py makemigrationsを実行してから、python3 manager.pymigrateを実行してmysqlにAccountテーブルを作成します。そして、コマンドpython3 manager.py createsuperuserを実行して、システムのスーパー管理者を作成します。これで、入力する必要のあるフィールドは、カスタマイズしたcreate_superuser関数と同じになります。

Accounts / admin.pyファイルに、スーパー管理者がこのテーブルを管理できるように、追加のクラスを作成します。

class AccountAdmin(UserAdmin):

list_display = ('email', 'username', 'first_name', 'last_name', 'last_login', 'date_joined', 'is_active')

list_display_links = ('email', 'username', 'first_name', 'last_name')

readonly_fields = ('last_login', 'date_joined')

ordering = ('-date_joined',)

filter_horizontal = ()

list_filter = ()

fieldsets = ()

admin.site.register(Account, AccountAdmin)

次に、上記のようにstartappコマンドを使用してアプリカテゴリを作成し、次のようにCategoryクラスをcategory /models.pyファイルに追加します。

from django.db import models

from django.urls import reverse

class Category(models.Model):

category_name = models.CharField(max_length=50, unique=True)

slug = models.SlugField(max_length=100, unique=True)

description = models.TextField(max_length=255, blank=True)

category_image = models.ImageField(upload_to='photos/categories/', blank=True)

class Meta:

verbose_name = 'category'

verbose_name_plural = 'categories'

def __str__(self):

return self.category_name

スラッグフィールドはカテゴリを識別するためのものです。category_imageフィールドはmedia / photos / categoryフォルダへのアクセスを許可します。このフォルダがなくても心配しないでください。Djangoが自分で作成します。 Metaサブクラスでは、変数verbose_nameとverbose_name_pluralを宣言します。そうでない場合、superadminページにカテゴリが表示されますが、これは正しいスペルではありません。 makemigrationsおよびmigrateコマンドを実行して、テーブルを作成します。

スーパーユーザーがカテゴリテーブルを管理できるように、category /admin.pyファイルのコードを追加します。

class CategoryAdmin(admin.ModelAdmin):

prepopulated_fields = {'slug': ('category_name',)} # Gợi ý trường slug theo category_name

list_display = ('category_name', 'slug')

admin.site.register(Category, CategoryAdmin)

次に、startappstoreコマンドを使用してproductテーブルを管理するためのアプリストアを作成します。 store / models.pyファイルで、次のようにProductクラスを作成します。

from django.urls import reverse

from category.models import Category

from django.db import models

class Product(models.Model):

product_name = models.CharField(max_length=200, unique=True)

slug = models.SlugField(max_length=200, unique=True)

description = models.TextField(max_length=500, blank=True)

price = models.IntegerField()

images = models.ImageField(upload_to='photos/products')

stock = models.IntegerField()

is_available = models.BooleanField(default=True)

category = models.ForeignKey(Category, on_delete=models.CASCADE)

created_date = models.DateTimeField(auto_now_add=True)

modified_date = models.DateTimeField(auto_now=True)

def __str__(self):

return self.product_name

store / admin.pyファイルには、スーパーユーザーが管理するアプリストアも追加します。

class ProductAdmin(admin.ModelAdmin):

list_display = ('product_name', 'price', 'stock', 'category', 'created_date', 

'modified_date', 'is_available')

prepopulated_fields = {'slug': ('product_name',)}

admin.site.register(Product, ProductAdmin)

greatkart / urls.pyファイルで、urlpattern変数を次のようにカスタマイズします。

urlpatterns = [

path('admin/', admin.site.urls),

path('', views.home, name='home'),

path('store/', include('store.urls')),

path('carts/', include('carts.urls')),

] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

さらに、アプリストアでは、urlpattern変数を使用してファイルurls.pyも作成します。

urlpatterns = [

path('', views.store, name='store'),

path('<slug:category_slug>/', views.store, name='products_by_category'),

path('<slug:category_slug>/<slug:product_slug>/', views.product_detail

 name='product_detail'),]

上記では、ファイルgreatkart / urls.pyでurlを宣言し、urlpattern変数は他のアプリへのパスのクラスターを宣言します。

Djangoはこのファイルからパスを自動的に見つけます。 store / urls.pyファイルのurlpattern変数は、パスのあり方を指定します。 親URLファイルから継承されたプレフィックスがあります。

 

8. カートのデザイン、CartItemモデル


コマンドstartappcartsを使用して、カートと同じアプリに2つのテーブルcartとcart_itemを作成します。 次の新しいクラスを使用して、carts /models.pyファイルをカスタマイズします。

class Cart(models.Model):

cart_id = models.CharField(max_length=250, blank=True)

date_added = models.DateTimeField(auto_now_add=True)

def __str__(self):

return self.cart_id

class CartItem(models.Model):

product = models.ForeignKey(Product, on_delete=models.CASCADE)

cart = models.ForeignKey(Cart, on_delete=models.CASCADE)

quantity = models.IntegerField()

is_active = models.BooleanField(default=True)

def __str__(self):

return self.product

そして、スーパーユーザーが管理するコードをcarts /admin.pyファイルに追加します。

admin.site.register(Cart)

admin.site.register(CartItem)

カートテーブルには、ログインしたユーザーと合格したユーザーの両方を含む、ユーザーのショッピングカートを説明するレコードがあります(レコードはローカルマシンのCookieに基づいて生成されます)。

対応するレコードを持つCartItemテーブルは、カート内のアイテムです。 外部キーが製品とカート付きを使用します。

次のようにカート/ urls.pyファイルにurlpartterns変数をカスタマイズします。

urlpatterns = [

path('', views.cart, name='cart'),

path('add_cart/<int:product_id>/', views.add_cart, name='add_cart'),

path('remove_cart/<int:product_id>/', views.remove_cart, name='remove_cart'),

path('remove_cart_item/<int:product_id>/', views.remove_cart_item, 

name='remove_cart_item'),

9. ホーム、ストア、product_detailのテンプレート


settings.pyページに移動し、キーと値のペアのTEMPLATES変数を次のようにカスタマイズします。

'DIRS': ['templates']

manager.pyを使用してテンプレートと同じレベルにフォルダーを作成し、Djangoがこのフォルダーを自動的に見つけてテンプレートファイルをロードできるようにします。greatkart / views.pyファイルから、home関数を追加して、リクエストナビゲーション関数を作成します。

def home(request):

products = Product.objects.all().filter(is_available=True)

context = {'products': products,}

return render(request, 'home.html', context=context)

テンプレートフォルダから、システム内のほとんどのページのベーステンプレートファイルとしてbase.htmlファイルを作成します。 そしてホームページとしてhome.htmlファイル。

 

10. ユーザーモデル、カテゴリ、製品モデルのカスタマイズ


Djangoを使用すると、多数のタスクに非常に迅速かつ簡単に取り組むことができます。 Pythonでのソフトウェア開発を安価で簡単にします。

また、データのシリアル化とXMLまたはJSON形式での提供も簡単になります。 これは、他のWebサイトまたはアプリケーションで使用されるデータを純粋に提供するWebサービスまたはWebサイトを作成する場合に役立ちます。

要約すると、Djangoフレームワークは、無料でシンプルな市場で入手可能な最高のPythonWebフレームワークの1つです。

 

オフショア開発をご検討されている方々はぜひ一度ご相談ください。

※以下通り弊社の連絡先

アカウントマネージャー: クアン(日本語・英語対応可)

電話番号: (+84)2462 900 388

メール:  [email protected] 

お電話でのご相談/お申し込み等、お気軽にご連絡くださいませ。

 無料見積もりはこちらから▶