Evgenii Legotckoi
Қаз. 8, 2018, 3:16 Т.Қ.

Как лучше описывать Generic View в Django? в файлах urls.py или во views.py

Django, urls, views, Generic

Добрый день, дорогие пользователи EVILEG!

Вот и я решил задать вопрос на своём форуме. Надеюсь на отклик. Давайте обсудим один вопрос.

Мне не даёт покоя одна мысль, где лучше прописывать Generic вьюшки в Django.

В документации есть два варианта, как использовать Generic вьюшки.

Первый вариант . Прописать всю информацию в Generic вьюшке прямо в файле urls.py

  1. from django.urls import path
  2. from django.views.generic import TemplateView
  3.  
  4. urlpatterns = [
  5. path('about/', TemplateView.as_view(template_name="about.html")),
  6. ]

Второй вариант . Наследоваться от Generic вьюшки, описать параметры во views.py, а потом уже подключить эту вьюшку в файле urls.py

views.py


  1. from django.views.generic import TemplateView
  2.  
  3. class MyView(TemplateView):
  4. template_name = "about.html"

urls.py


  1. from django.urls import path
  2.  
  3. from myapp.views import MyView
  4.  
  5. urlpatterns = [
  6. path('about/', MyView.as_view()),
  7. ]

Мне не даёт покоя одна мысль, даёт ли какой-то бонус в производительности или потреблении памяти, если наследоваться от Generic вьюшки, когда нужно переопределить 5-6 атрибутов, да или даже всего 1 атрибут. Или лучше сразу прописывать всё как в первом варианте прямо в urls.py. Или это скорее уже вопрос код стайла, который имеется внутри команды разработчиков?

Кто-нибудь задавлся подобным вопросом или проводил тесты подобного вопроса?




2

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

8
Илья Чичак
  • Қаз. 8, 2018, 3:25 Т.Қ.

Вообще, выигрыша никакого не получится, поскольку все инициализируется в один момент (загрузки приложения), а не on-demand, как PHP. Однако, архитектурно, более правильным вариантом я считаю - наследование. Поскольку, чуть позже, если захочется развить эту вьюху, все равно придется выносить в отдельный модуль.

    Evgenii Legotckoi
    • Қаз. 8, 2018, 3:35 Т.Қ.

    Вот и я склоняюсь к решению с наследованием, тем более, что когда нужно описать 5-6 атрибутов, то файл urls.py становится менее красивым, чем хотелось бы.

    Но сам по себе вопрос возник из того, что я стараюсь разрабатывать сайт абстрагируясь от конкретных реализаций контента, таким образом имеется одна общая часть, которая работает одинаково для статьей, комментариев, разделов, сообщений на форуме и т.д. В итоге появляется один кастомный GenericView, который благодаря метамагии Python обрабатывает сразу 5-6 url в файле urls.py для всех этих типов контента, и будет обрабатывать в будущем ещё 10, 20 да сколько потребуется.

    Вот и возникает вопрос. Писать на каждый url свою вьюшку или оставить всю инициализацию в urls.py.

    Хотя если всё прописать в views.py, то чисто на взгляд проще будет отрефакторить, поскольку код там читабельнее, но в итоге рефакторинг приведёт к тому, что появится новый GenericView, который будет описываться в urls.py и всё по новому...

    Я так постоянно хожу по кругу с рефакторингом...


      Илья Чичак
      • Қаз. 8, 2018, 4:03 Т.Қ.

      Явное лучше, чем не явное.

      не надо экономить байты кода=)

      а по поводу урлов - ради абстракции их можно хранить же вместе с представлением. и и любом другом проекте можно будет сделать include('....urls').


      а что обрабатывает GenericView? может быть было бы правильнее вынести это в middleware, а сами вьюхи оставить чистыми?

        Evgenii Legotckoi
        • Қаз. 8, 2018, 4:10 Т.Қ.

        Эти дженерики у меня обрабатывают формирование запроса в зависимости от модели данных и подставновку нужных шаблонов для формирования ListView объектов.

        Но там есть ещё и немного JavaScript, который отвечает за частичную загрузку страницы при пагинации. Это реализовано для активностей, подписок и избранного в личном профиле пользователя, при пагинации на главной странице сайта. И ещё кое-где.

        Поэтому не думаю, что это тот функционал, который имеет смысл выносить в middleware...


          Илья Чичак
          • Қаз. 8, 2018, 9:13 Т.Қ.

          я не до конца понял - без кода сложно. в целом, я считаю, что мета-программирование - такое себе занятие. и нужно быть КРАЙНЕ осторожным с его применением=) а то насмотрелся=))) отлаживать, или, простихоспади, исправлять что-то - превращается в адовый ад=)

            Evgenii Legotckoi
            • Қаз. 9, 2018, 1 Т.Қ.

            После дебага шаблонов на Qt/C++ с сигналами и слотами мета-программирование на Python мне не кажется таким уже сложным )))

            Но согласен, что здесь нужно подходить осторожно. Я мета-программирование со всякими getattr , __name__ , __class__ применяю только для реализации общего, по факту библиотечного функционала, но это требует, чтобы код вылежался до стабильного состояния. Я поэтому медленно вывожу базовые исходники сайта в ESNF-C . По сути считаю весь не выведенный в Open Source функционал в качестве pre-alpha unstable .

              Илья Чичак
              • Қаз. 9, 2018, 2:04 Т.Қ.

              не, __name__, __class__ и все прочее - еще пока даже не мета-программирование. я имею в виду создание классов и функций на летуне по шаблону, а на основе каких-то миксинов или того хуже - из ничего. а то был у меня опыт писать возможность расширения функционала - был создан базовый класс, от которого надо было наследоваться другому человеку и несколько статических параметров, типа url-а и названия страницы. человек описывал нужное, описывал нужную выделенную логику. а в момент инициализации сервера строилось дерево URL-ов и связанные вьюхи. такое себе, конечно, но по другому было бы сложно - человек не умел в джангу. а так ему надо было все описывать в одном месте.

                Evgenii Legotckoi
                • Қаз. 9, 2018, 2:22 Т.Қ.

                Не, ну это конечно треш... такая шаблонизация - это что-то из ряда вон выходящее...

                Как бы шаблонная логика на проверке наличия тех или иных атрибутов - это одно, а если создавать классы из "чего-то" просто потому, что другой человек не умеет этого чего-то сам - это конечно что-то из ряда вон выходящее... Я за адекватные шаблоны!



                  Пікірлер

                  Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                  Кіріңіз немесе Тіркеліңіз