Search by

    django oscarで日本語ECサイトを作ってみる

    django oscarで日本語ECサイトを作ってみる

    概要

    django-oscarでECサイトを作っています 公式ドキュメントだけではわかりにくかったことをメモしておきます。

    カスタマイズの基本

    oscarの本体から、カスタマイズしたいアプリをフォークして、その中でカスタマイズを行います。 公式チュートリアル

    $ ./manage.py oscar_fork_app order yourappsfolder
    Creating package yourappsfolder/order
    Creating admin.py
    Creating app config
    Creating models.py
    Creating migrations folder
    Replace the entry 'oscar.apps.order.apps.OrderConfig' with 'yourappsfolder.order.apps.OrderConfig' in INSTALLED_APPS

    上記でoscar.apps.order.apps.OrderConfigをリプレイスしてねってコメントが出るんですが、そのアプリがないという。。。のがわかりにくい。

    同じこと思っている人がいるみたいでGitHubでも話題に挙がっています。 ドキュメント側を修正する方向に向かっている様です。 (本来INSTALLED_APPに記載するべきはoscar.apps.orderではなく、oscar.apps.order.apps.OrderConfigということですね。)

    下記の様にすると動きました。

    setting.py
    INSTALLED_APPS = [
        ...
        # 'oscar.apps.order',
        'yourappsfolder.order.apps.OrderConfig',
        ...
    ]

    djangoのAppconfigについても少し調べてみましたが、メリットがよくわからず。 モジュールをそのまま読み込むよりも、メタ情報をまとめて読み込める方が、何か利点があるのだと思います。

    日本語へ翻訳

    独自の.poファイルを作成して、その中を翻訳、コンパイルすれば良い。 公式チュートリアル

    しかし、修正しても翻訳が反映されない。。。 公式に書いていることに加えて、この設定が必要でした。
    (もしかしたら、自分が何かを見落としているだけかもしれないですが。)

    setting.py
    LOCALE_PATHS = (
        os.path.join(BASE_DIR, 'locale'),
    )

    翻訳が進んだファイルはこちらにありました。 作成したpoファイルに、上記を上書きして、コンパイルするとほぼ全ての表記が日本語になります。 (公式では「Transifexが最新ですよ」と書いてあるけど、それがどこにあるのかよくわからなかった。)

    発送方法の変更

    これも一旦フォークするところから。 公式チュートリアル

    発送方法がmethods、それをハンドルするクラスがRepositoryです。 自分で発送方法を追加する場合は、ローカルのディレクトリの中に、repository.py, methods.pyを作ってオーバーライドします。 この時送料の条件等を自分で実装できるみたいですね。荷物の中身、金額、住所などが変数になるでしょうか。

    例えば、注文の合計金額が、2000円以上なら送料無料!とするには下記の様に実装できます。

    repository.py
    from oscar.apps.shipping import repository
    from oscar.apps.shipping import methods
    from . import methods as mymethods
    from decimal import Decimal as D
    
    class Repository(repository.Repository):
        methods = (methods.Free(), mymethods.Yamato())
    
        def get_available_shipping_methods(
                self, basket, shipping_addr=None, **kwargs):
            if basket.total_excl_tax < D('2000.00'):
                self.methods = (mymethods.Yamato(),)
            else:
                self.methods = (methods.Free(),)
    
    
            return self.methods
    methods.py
    from oscar.apps.shipping import methods
    from oscar.core import prices
    
    from decimal import Decimal as D
    from oscar.core import prices
    
    class Yamato(methods.Base):
        code = 'Yamato'
        name = 'ヤマト運輸'
    
        def calculate(self, basket):
            # 送料は固定で800円の場合
            return prices.Price(
                currency=basket.currency,
                excl_tax=D('80.00'), tax=D('800.00'))

    決済

    決済は、デフォルトでは実装されていないので、自分で書く必要がある。 stripe.jsを使ってみたくてあれこれしてみた。

    stripe.js特徴

    • 金額など、決済情報はサーバ側で生成する。(クライアント側よりも安全に生成できる。)
    • クライアントからjsで決済処理をする。(アプリサーバにカード情報送信しなくていいので安全)
    • 処理の結果はjsonで返ってくるので、それをアプリサーバ側に再度投げる様な実装になる。
    • テスト用のアカウント、カードがすぐに利用できるので、開発に着手しやすかった。
    • 売り上げ管理のダッシュボードが綺麗で見やすい
    • ドキュメントがほぼ英語

    クライアントが2つのサーバーの中継地点になる、みたいな開発をしたことがなかったので、どんな風に開発するべきなのかがいまいちわからない部分もあった。

    django側の実装の概要は下記

    • PaymentDetailsViewをオーバーライドする
    • get_context_data()の中で、stripeのintentオブジェクトを生成して、 intent.client_secretをクライアントに渡す。
    • クライアントでstripe apiを読んでプレビルドされた決済formを表示、それを通じてstripeと決済する。
    • 返ってきた結果をdjangoに返す。(ここでajaxを使ったけど、こういうやり方でいいのかな。)
    • handle_payment()をオーバーライドして、結果の記録する。

    コードはもう少し使えるレベルまでブラッシュアップしてからpushしたい。

    今のところの感想

    ASP vs Open Source

    Open Sourceを利用してのECの構築、実装自体はそこそこ楽しいのですが、本格的に使えるサイトにするにはそこそこに労力が要りそうですemoji-joy

    ビジネスロジックを簡素にできるなら、ASPを利用した方がコスパが良いと感じます。

    一方、独自色出したいときは、こういうフレームワークを使わないと難しそうです。 基本的にはモノを売ればいいって言う状況なのか、独自のサービスが必要なのかで検討すればいいのではないでしょうか。 コスト面では正直労力を考えるとどちらもあまり変わらないと思います。 (ASP:コスト高、手間少 Open Source:コスト少、手間多)

    人的リソースの中にプログラムと英語がそこそこ好きな人がいれば、後者がいいのではないでしょうか。 モチベーションが上がると思うので(圧倒的自分目線…っ!)

    「手持ちのカードでできることをやる」が大事ですね。 「やれることがあるのにやらない」人生にはしたくないものです。(突然の人生観)

    参考