ФорумПрограммированиеPythonDjango → Objects state assertion

Objects state assertion

  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 27 марта 2014 г. 17:36, спустя 9 минут 45 секунд

    Чего-то не врубаюсь без куска кода. @adw0rd вроде понял о чём речь, потом у
    него спрошу :)

    @mathete, например схема платежной системы: форма на сайте => редирект на платежник => check query на твой сервер => страница оплаты => payment transaction commit.

    в твоем check

    def check(request):
        invoice = get_invoice()
        assert invoice.status == 'new', _("You can pay only new invoices")
        check_other_params()
    

    как правило, такие же штуки аля check query хуй кладут на ответ, если там не OK(response body) или 200 код ответа.

    Ну это про платежку, а вообще проблема которая в верстке проекта не позволяет юзеру найти ссылку на такой запрос на сервер, но его можно "подделать" руками например (curl/wget/etc). На такие запросы надо просто отвечать "Ой бля!", и нет смысла долго рассказывать (custom error page) что не так все таки произошло.

    Сапожник без сапог
  • mathete

    Сообщения: 435 Репутация: N Группа: Джедаи

    Spritz 27 марта 2014 г. 18:39, спустя 1 час 3 минуты 1 секунду

    А это не

    def check(request, invoice_id):
    invoice = get_object_or_404(Invoice, pk=invoice_id, status='new')
    invoice.do_some_with_correct_invoice()

    или

    class InvoiceManyValidationsForm(forms.Form):
    invoice = forms.ModelChoiceField(queryset=Invoice.objects.filter(status='new'))
    some_field = ….
    ….
    some_fieldN = …

    def check(request):
    form = InvoiceManyValidationsForm(request.POST)
    if form.is_valid():
    form.do_some_special_with_cleaned_data()
    else:
    …..


    В первом случае, если всё что нам надо из запроса это просто взять в одну строчку объект и дальше с ним работать/
    А во-втором, всю валидацию собрать в форме, где ей и место.
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 27 марта 2014 г. 18:41, спустя 2 минуты 34 секунды

    @mathete, да, этот подход ОК.

    Если ты логику во view пишешь.

    Я же пишу ее в модели юзера, а вьюхи только вызывают invoice.accept_payment(request)

    так мне удобнее - в том плане, что это исключает дублирование кода.

    и вызвано может быть как с console commands так и с web request

    Сапожник без сапог
  • mathete

    Сообщения: 435 Репутация: N Группа: Джедаи

    Spritz 27 марта 2014 г. 18:44, спустя 2 минуты 47 секунд

    @phpdude, Как ты в console commands передаёшь HttpRequest в метод модели?
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 27 марта 2014 г. 18:59, спустя 14 минут 42 секунды

    @mathete, это я утрировал) реально я передаю например postrow. которую могу логировать.

    ну или чтото другое.

    Сапожник без сапог
  • adw0rd

    Сообщения: 22952 Репутация: N Группа: в ухо

    Spritz 28 марта 2014 г. 0:39, спустя 5 часов 40 минут 21 секунду

    get_object_or_404 - тот же exception, который перехватится и вызовет рендеринг 404 страницы. Хотя я бы тут вызывал

    from django.core.exceptions import PermissionDenied
    raise PermissionDenied('..something...')
    

    Чтобы была 403

    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • mathete

    Сообщения: 435 Репутация: N Группа: Джедаи

    Spritz 28 марта 2014 г. 4:37, спустя 3 часа 57 минут 57 секунд

    Я хотел сказать, что в большинстве случаев, когда валидация возможна в одной точке, её и следует там проводить и для этого придуманы формы.
    А выбрасывание исключений я сам юзаю, в случаях, когда валидация по определению размазана. Это может быть или завязка на череду запросов к внешним сервисам, или сложная бизнес-логика с большим количеством запросов в тразакции.
    @adw0rd, да, это внутри эксепшен, но уже с готовым обработчиком, в одну строчку (включая проверку) и известный любому школьнику.
    И я там бы оставил 404. 403 это когда клиент может каким-то образом поменять запрос (добавить заголовки, поменять IP и пр.) и всё-таки получить результат. А когда у него этой возможности нет вообще, и доступ он никак получит, пока сервер не изменит целевой объект, то для клиента это 404.
  • adw0rd

    Сообщения: 22952 Репутация: N Группа: в ухо

    Spritz 28 марта 2014 г. 5:06, спустя 29 минут 15 секунд

    Да, про Invoice согласен что 404. У меня смешался топик, а дуду надо либо PermissionDenied, либо assert в тех местах, куда пользователь нормально не может добраться

    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 28 марта 2014 г. 5:14, спустя 8 минут 6 секунд

    @adw0rd, твой код тож применим к логике которая прямо во view находится))

    Спустя 103 сек.

    @mathete,

    А выбрасывание исключений я сам юзаю, в случаях, когда валидация по определению размазана.

    ну вот про это я и говорю короче)

    Спустя 55 сек.

    както долговато пыха оживает после нового сообщения вставки.

    зря наверное всю метаинфу о соощении сунули в одну таблицу с самими сообщениями.

    Сапожник без сапог
  • adw0rd

    Сообщения: 22952 Репутация: N Группа: в ухо

    Spritz 28 марта 2014 г. 5:37, спустя 22 минуты 37 секунд

    А какая там лишняя мета-инфа, которая не нужна при выводе поста?

    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 28 марта 2014 г. 5:47, спустя 9 минут 52 секунды

    А какая там лишняя мета-инфа, которая не нужна при выводе поста?

    @adw0rd, вся :-)

    на самом деле я имел ввиду, что текст надо отдельно кидать - тогда insert'ы быстрее будут.

    таблички тупят если они большие ... увы) пока индексы ребилдятся

    Сапожник без сапог

Пожалуйста, авторизуйтесь, чтобы написать комментарий!