Sly32

Рейтинг
389
Регистрация
29.03.2012
Должность
Software engineer
Александр Воробьев #:
Обычно для апи и веба разные миддлвары подключают. (настройка на уровне маршрутов и групп маршрутов). В контроллер мы попадаем уже через все эти миддлвары.
В Фастапи/джанго немного другая философия. Миддлвари используются  как прослойка на верхнем уровне, если нужно чем-то насытить респонс - для этого есть зависимости(Depends) которые насыщают респонс нужными данными непосредственно.
Да, у меня четкое разделение и все запросы в апи идут через JWT токен. По факту, существующий фронт - временное решение чтобы не заморачиваться, он все равно передет на Реакт. Так что или писать отдельную апи или проверять запрос и в зависимости от него отдавать результат.
Vladimirus #:
Тут еще проще, если права свободна, зачем моргун прет в левую? Едь по свободной правой.
Открой ПДД и почитай сначала, прежде чем давать такие советы. 
Александр Воробьев #:
В моем понимании создавая контроллер я не знаю как и зачем он будет использоваться. И на какие маршруты отвечать. Это не ответственность кода контроллера. Это ответственность системы маршрутизации.
Именно так это и работает в Фастапи. Роутер просто вызывает обработчик и дальше отдает ответ, в зависимости от потребности или JSON  или HTML(После рендера контекста)
Александр Воробьев #:
что в твоем, что в моем коде есть лишнее условие, которое решаемо на уровне роутинга. Тут, имхо, нарушение и солид
Нет, ты что то путаешь. Все разделено. Роутинг принимает реквест -делает запрос в менеджер, который в свою очередь может делать запрос в БД, например или еще какая-то логика и отдает назад ответ.
Александр Воробьев #:
Потом rest обычно подразумевает более широкий спектр статусов ответов...  ну понято, что ты привел просто пример, но все же нужная ли это фича? :)

Я пока думаю над этим, нашел эту фичу именно читая этот топик. Раньше я всегда отдельно писал АПИ для возврата JSON, отдельно  для браузера

У меня будут еще мобильные приложения и наличие такого ответа сильно упрощает код

Вячеслав Скоблей #:
Вспомнилось, что полеты Аполлонов не транслировались в СССР!
Да, удивляет что в российских новостях ВООБЩЕ об этом не пишут. Хотя скорее не удивляет а печалит.
Vladimir #:
Но, к примеру в Европе, в первую очередь увольняют разрабов с высшей математикой, с зарплатой от 10к и выше
И откуда же такие инсайды? Из головы? Увольняют по разным причинам, глупые абсолютно выводы.
ArbNet #:
Очень глупое мнение..
Не глупое. Гораздо легче если есть хорошая база. 
ArbNet #:
Будь вы с кучей высших образований и гений математики, других наук, если вы ничего не создаёте, то всё что вам светит это зарплата бюджетника или сотрудника какой-то фирмы.

А что значит создавать?  Вот у нас есть сотрудница, с опытом в биотехе. Под нее специально создавали позицию и специальные условия, чтобы она не увольнялась, когда было закрыт филиал в РФ.  Для ценных сотрудников - спецальные условия. И это именно за их знания. 

Гении-самоучки, конечно существуют. Но в целом хорошая база - большое подспорье. Даже изучение нейросетей требует хорошей математики.  Мне вот часто ее не хватает и приходится отматывать работу к изучению/вспоминанию основ. А как продавать свои знания - отдельный вопрос. 

Vladimir #:
Встречал довольно многих таких
Не переживай, я тоже много таких встречаю, мастеров спора СССР по йоге, которые переворачиват смысл любой фразы, как в гамаке. Им видимо поэтому и мерещится  "щенячий восторг". Я, в отличие, не турист. И не один год уже живу тут. И рассказываю всегда о своем опыте а не том, что пишут в интернете. Это и без меня можно прочитать.
И жил я в отличной стране и перехал в новую, но связи не теряю, чтоб ты понимал. Так что уже если нечего сказать - лучше промолчать.
Ponyk #:
Вообще есть поговорка - кто понял жизнь, тот не торопится.
А мне не нравится эта поговорка в целом. Хочется успеть попробовать многое. Но для этого точно не нужно быть бараном на дороге. Счас могут опять про "щенячий" восторг, но я вот реально понимаю, что за 5 лет сильно изменился мой стиль вождения. Пропала нервозность, попытка кому-то что-то доказать. Цель - спокойно доехать за оптимальное время, получить удовольствие от дороги, не доставлять дискомфорта другим участникам движения. Уже нет цели всех обогнать и приехать на 2 минуты раньше. Я лучше заранее спланирую маршрут.
Александр Воробьев #:

Для пользователя (тот что на уровне шаблона уже) это будет выглядеть так

Конечный синтаксис еще не утвержден, но примерно как то так

Поздравляю, ты переизобрел jinja2. Именно так и работает пайтоновский шаблонизатор. Там очень удобная кастоизация, позволяющая создавать что угодно.
Делаешь базовый шаблон вида:
<!DOCTYPE html>
<html lang="ru">
  <head>
    {% include "head.html" %}
  </head>
  <body>
    {% include "navbar-main.html" %}

    <main class="container-fluid py-4">
      {% block content %}{% endblock %}
    </main>

    {% include "footer.html" %}
    {% include "cookie-consent.html" %}
    
    <script>
      (function () {
        const csrfToken = "{{ csrf_token | default('') }}";
        if (!csrfToken) return;
        const forms = document.querySelectorAll("form");
        forms.forEach((form) => {
          if (form.querySelector('input[name="csrf_token"]')) return;
          const input = document.createElement("input");
          input.type = "hidden";
          input.name = "csrf_token";
          input.value = csrfToken;
          form.appendChild(input);
        });
      })();
    
</script>
    <script src="/static/js/cookie-consent.js"></script>
  </body>
</html>


А потом просто наследуешься от него и создаешь кастомные страницы, переопределяя нужные тебе блоки таким образом - 

{% extends "base.html" %}

{% block content %}
<link rel="stylesheet" href="{{ url_for('static', path='/css/errors.css') }}">
<div class="container">
    <div class="row justify-content-center align-items-center" style="min-height: 70vh;">
        <div class="col-md-8 text-center">
            <div class="error-content">
                <h1 class="display-1 fw-bold text-danger">403</h1>
                <h2 class="mb-4">Access Forbidden</h2>
                <p class="lead text-muted mb-4">
                    {{ error_message or "You don't have permission to access this resource." }}
                </p>
                <div class="mb-4">
                    <i class="bi bi-shield-exclamation text-danger" style="font-size: 5rem;"></i>
                </div>
                <div class="alert alert-warning mx-auto" style="max-width: 600px;">
                    <i class="bi bi-info-circle"></i>
                    <strong>Need access?</strong> Please contact the administrator or try logging in with appropriate credentials.
                </div>
                <div class="d-flex justify-content-center gap-3 mt-4">
                    <a href="{{ url_for('index', lang=language) }}" class="btn btn-primary btn-lg">
                        <i class="bi bi-house-door"></i> Go to Home
                    </a>
                    {% if not is_authenticated %}
                    <a href="{{ url_for('user_login', lang=language) }}" class="btn btn-success btn-lg">
                        <i class="bi bi-box-arrow-in-right"></i> Login
                    </a>
                    {% endif %}
                    <button onclick="window.history.back()" class="btn btn-outline-secondary btn-lg">
                        <i class="bi bi-arrow-left"></i> Go Back
                    </button>
                </div>
            </div>
        </div>
    </div>
</div>
{% endblock %}

Отличная получилсь дискуссия, пока меня упекли(за дело) в баню. Зарекаюсь с экономистами дальше дискутировать)))

Александр,   Алексей, MrPi(Сорри, не знаю настоящего имени) - спасибо! Впервые за долгое время   - конструктивный разговор, Даже вставки флудеров не испортили.

Дискуссия кстати заставила копнуть разницу между Симфони и  Фастапи. Стал понимать ваши трудности. Мне кажется в ФА более логичная структура и правильный рендер аутпута. 
Если в симфони профайлер рендерит через тэги, то Фастапи использует шаблоны и готовый контекст.
Это гораздо быстрее.
Ну и роутинг удобнее. Причем можно создавать роуты, которые одновременно будут уметь работать как с REST API,  так и с HTML шаблонами.
В чистом виде DRY

@router.get("/my-quizzes", name="my_quiz_list")
async def my_quiz_list(
    request: Request,
    session: AsyncSession = Depends(get_async_session),
    current_user: dict = Depends(get_current_user_db),
    context: dict = Depends(page_context)
):
    # 1. Получаем «универсальные» данные
    data = await get_my_quizzes_data(session, current_user.get('user_id'))
    
    # 2. Проверяем, что хочет клиент (Content Negotiation)
    accept_header = request.headers.get("accept", "")
    
    if "application/json" in accept_header:
        # Отдаем чистый JSON для API
        return data

    # 3. Если это браузер, подмешиваем данные в контекст Jinja2
    full_context = {**context, **data}
    full_context["current_user"] = current_user
    full_context["page_title"] = "My Quizzes"
    
    return templates.TemplateResponse("my_quizzes.html", {"request": request, **full_context})
Уже на полмиллиона км улетели, молодцы. Инопланетяне пока никак не реагируют)))
divv #:
В https://bothub.chat есть практически все пропулярные нейросети. Есть api.
все это развод, нет там реальных моделей нормальных, еще и бесплатно.
Vladimir #:
Вопрос зачем тогда сюда тащить все польское, если ты о нем не в курсе?

Все твои знания о Европе только с гуглокарт, это очевидно уже. Я то как раз и в курсе, для меня нормально на выходных сгонять куда за 1000 км. И видел я и пробки на платных автобанах и горные дороги, не говоря уже об обычных маршрутах по Польше. Придумал какую-то  "стандартную" скорость и не  умолкаешь. И нучись уже читать, понятно что когда дорога загружена, никто не будет моргать тебе.  А если ты вылез в левую и тошнишь там - то запросто. Да, это не Беларусь, где тебя обгонят и начнут "учить", оттормаживаясь. Но на хвосте повиснуть могут запросто. 

Я уже почти уверен что ты ни разу европейских дорог не видел. 

Dmitriy_2014 #:
Прикинь братан, а я за всю свою жизнь никогда никого не сгонял с левой крайней полосы и не сигналил мигал, бычку не врубал,

То есть ты считаешь что это лучше?

Dmitriy_2014 #:
Бывает что два ряда заняты потоком машин, не только побибикать, но и пострелять из травмата почему бы и нет. Я не говорю что я прям белый и пушистый и подрезать и посигналить за долю микросекунды до зеленого это наше все
Всего: 8124