2017-02-16 32 views
0

Я думаю о внедрении State Machine для проекта электронной коммерции - в частности, для рабочего потока из пустой корзины в состояние, в котором производится оплата.Реализация государственной машины для электронной коммерции (Django)

Кроме того, Корзина хранится в сеансе с использованием рамки сеанса Django. Я не могу окутать голову, должен ли конечный автомат быть частью реализации Cart или автономным, но «подключен» к Cart через API.

Просто отказ от ответственности, я действительно новичок в государственных машинах, поэтому я не слишком хорошо знаком с теоретическими концепциями, но из моих собственных исследований это кажется чем-то действительно полезным для моего проекта.

Мой мыслительный процесс как таковой:

state_machine.py

class StateMachine(object): 
    states = ['empty', 'filled', 'prepayment', 'payment_auth', 'order_placed'] 

    ... # methods that trigger state changes 

и в cart.py, каждое действие может вызвать изменение состояния:

state_machine = StateMachine() 

class Cart(object): 
    ... 
    def add_item(self): 
     ... 
     # add item to cart 
     # then trigger state change 
     state_machine.fill_cart() --> triggers a state change from 'empty' to 'filled' 

Сеанс следует хранить что-то вроде это:

request.session[some_session_key] = { 
    'state': 'filled', 
    'cart': { 
     # cart stuff goes here 
    }, 
    ... 
} 

Я не уверен, что то, что я делаю, избыточно, возможно, я должен реализовать государство в самой Cart (как атрибут), а не как отдельный объект.

Поблагодарили бы за любые советы!

+0

[Джанго-FSM] (https://github.com/kmmbvnr/django-fsm) может быть то, что вам нужно – Nghung

+0

@Nghung я смотрел на нее. Похоже, что это предназначено для моделей, если я храню информацию о штатах и ​​тележках в сеансе, я не буду использовать модели ... fsm все еще актуально? Может быть, я пропустил что-то? –

+1

жаль, что я пропустил, что вы используете сеанс. Ознакомьтесь с пакетом [переходы] (https://github.com/tyarkoni/transitions). A [обратный вызов] (https://github.com/tyarkoni/transitions#callbacks) для изменения статуса сеанса может быть присоединен, когда объект уходит или переходит в состояние. – Nghung

ответ

1

Как обсуждалось, реализация конечного автомата в Python с именем transitions соответствует потребностям OP. Обратные вызовы могут быть присоединены, когда объект входит или покидает определенное состояние, которое может использоваться для установки состояния сеанса.

# Our old Matter class, now with a couple of new methods we 
# can trigger when entering or exit states. 
class Matter(object): 
    def say_hello(self): 
     print("hello, new state!") 
    def say_goodbye(self): 
     print("goodbye, old state!") 

lump = Matter() 
states = [ 
    State(name='solid', on_exit=['say_goodbye']), 
    'liquid', 
    { 'name': 'gas' } 
    ] 
machine = Machine(lump, states=states) 
machine.add_transition('sublimate', 'solid', 'gas') 

# Callbacks can also be added after initialization using 
# the dynamically added on_enter_ and on_exit_ methods. 
# Note that the initial call to add the callback is made 
# on the Machine and not on the model. 
machine.on_enter_gas('say_hello') 

# Test out the callbacks... 
machine.set_state('solid') 
lump.sublimate() 
>>> 'goodbye, old state!' 
>>> 'hello, new state!'