Как стать автором
Обновить

Комментарии 71

Супермен, ты всё-таки существуешь!

Непонятно только, что теперь делать с кучей старых но вполне качественных приложений. Некоторые из них уже и не поддерживаются, но вполне себе работают.
Не обновлять Django до версии в которой уберут get_profile()?
По-моему, get_profile() мало где используется ввиду своей ущербности. Да и не о нём речь, а о приложениях, в которых захардкожена ссылка на User:

from django.contrib.auth.models import User

class Blog(models.Model):
    user = models.ForeignKey(User)


А ведь есть ещё и всякие django-registartion и аналоги, где создаются объекты именно auth.User. Существенная часть приложений, возможно даже хороших, станет несовместимой.
Ну так эту модель, судя по документации, вроде, не убирают? Проблемы будут при совместном использовании и того и того способа, это да, в доке так и сказано.
В этом весь трагизм ситуации и заключается: появился чудесный механизм, а использовать его совместно с другими батарейками не получится.
Использовать с батарейками можно будет когда батарейки подтянутся. Пока же ещё даже релиза не было. У авторов батареек ещё есть время поправить, что надо. Тем более, это не так уж и сложно.
Некоторые из них уже и не поддерживаются, но вполне себе работают.

Если они такие полезные, то нично не мешает их поправить. Или форкнуть.

Заменить User на settings.AUTH_USER_MODEL или на get_auth_model() это не такое уж и большое дело.
Форкнуть их, конечно, можно. Скорее всего, так и придётся делать. Но осадочек всё-таки останется: больше не выйдет написать, например,

$ pip install django-registration

потому что в PYPI лежит устаревший модуль. Всем придётся делать что-то типа такого.

$ pip install -e git+github.com/fork-author/django-registration-fork#egg=django-registration

Единого реестра «официальных» форков, разумеется нет. Откуда же разработчикам знать, откуда брать то или иное приложение? Каждый будет форкать, что только будет увеличивать энтропию вселенной :)
назови его django-registration-s и добавь в PyPI
Так и будут делать, скорее всего. Что, впрочем, не отменяет ремарки про увеличение энтропии вселенной.
а как предлагаешь надо было сделать это?
Я вижу только один выход: смириться. Ну, либо писать забившим мэйнтейнерам, чтобы уступили штурвал тем, кто хочет заниматься поддержкой. Хотя это, конечно, утопия.
А pull requests отменили?

Если разработчик живой (извините за прямоту), то он всегда может принять Ваши изменения в проект, если опишите адекватно что и зачем меняли
А если не живой? Если ушёл в другие сферы деятельности или просто потерял интерес к проекту? Или доступ?

Я уже и не говорю о том, что многие разработчики популярных и развивающихся продуктов откровенно игнорируют пулл риквесты, за которое очень активно голосует сообщество.
Кроме объявления get_profile устаревшей других изменений ломающих совместимость нет.

Ещё возможно, сломана локализация админки (мне так показалось при просмотре коммита).
Как я понял в джанго 1.5 профиле уже не нужны. Это говорят сами разработчики и они убрали AUTH_PROFILE_MODULE
Ничего не убрали. Просто объявили устаревшим. Использовать по-старому всё ещё можно.
Это круто, конечно. Осталось только всё переписать :)
Жили же как-то с AUTHENTICATION_BACKENDS и наследованием своих пользовательских моделей от базовой User. Сторонние приложения получают нашу модель, но работают с ней как со стандартной и не жалуются (ибо унаследована именно от неё). Так что ничего революционного я тут особо не вижу, похожий функционал можно получить и с текущей версией.
Ключевое слово — «как-то». Да, оно действительно работало, но душа перфекциониста требует избавления от уродливых костылей.
Наследование моделей — это синтаксический сахар к OneToOneField (imho очень редко когда нужный); в базе при наследовании от User данные располагались в разных таблицах. С AUTH_USER_MODEL — в одной таблице (+ обязательных полей вроде меньше).
Очень круто, можно будет наконец-то сделать нативную авторизацию через email в качестве username без применения доп. костылей
Лолчто, она и так была всегда безо всякий костылей, на это оабсолютно никак не влияло использование стандартной модели django. У меня во всех проектах авторизация по емейлу
Ограничение символов username — 30 вместо 75, если я не ошибаюсь, а чтобы обойти это ограничение нужны такие костыли…
А причем здесь username? Кастомная авторизация у меня работала именно по полю емейла. Вот username надо было чем-то забивать — это был неольшой костяль, да :)
*небольшой костыль
В детстве был любимый мой фильм.
О господи…
user = models.ForeignKey(settings.AUTH_USER_MODEL)

мне становится как-то не по себе, если этот паттерн войдет в моду. :/
возможно, в моду войдет паттерн еще покруче:

user = models.ForeignKey(getattr(settings, "AUTH_USER_MODEL", "auth.User"))
Вряд ли :-)

AUTH_USER_MODEL = 'auth.User'

скорее всего определят в django.conf.global_settings.
Я про приложения, которым нужно поддерживать django < 1.5.

В 1.4, впрочем, заглушку добавят, наверное — да и ничто не мешает просить пользователей в settings руками настройку добавить так-то.
волнует не сколько конкрентая ситуация, а вообще данный способ реализации dependency injection, внутри django. ведь разработчики примут это за best practices и начнут подражать направо и налево. в пределе — все ссылки внутри ForeignKey заменяются константами из settings — что дикий ужаснах.
Судя по докам, там как-то так:

from django.contrib.auth import get_user_model

class Post(models.Model):
    user = models.ForeignKey(get_user_model())

То есть вроде бы как интерфейс учтён.
А вот ещё только что подумалось:

  1. В django.contrib.auth.models переименовываем модель User в UserModel
  2. Там же, в django.contrib.auth.models, переопределяем User:

    User = get_user_model()

  3. В django.conf.global_settings указываем AUTH_USER_MODEL = 'auth.UserModel'


Походу, тогда и с обратной совместимостью проблем не возникнет.

Только циклические импорты будут
Хм. Я не заметил. Где именно они возникнут?
в get_user_model() придётся импортировать модуль из settings.AUTH_USER_MODEL, а в этом модуле нужно импортировать auth.models, чтобы унаследоваться от стандартного User
в get_user_model() придётся импортировать модуль из settings.AUTH_USER_MODEL,


В текущей реализации get_user_model используется стандартная джангина get_model, например.
которая импортирует все модели, но потом не при импорте пакета, а

User = get_user_model()

выполнится при импорте django.auth.models
А, понятно. А если так?

User = lazy_object(get_user_model())

Так работать будет, но всякие lazy штучки — абстракция дырявая, когда не реализовано на уровне языка.

Что, например, вернёт type(User) в таком случае? Или что будет когда кто-то попытается отнаследоваться от такого User? В общем, такое решение приведёт к не очевидному поведению и фрустрации разработчиков. Удобство не окупится.
Чёрт, убедительно.

Хотя type(User) в реальном коде маловероятно, а наследоваться уже и не понадобится в принципе, на такие усложнения не пойдут. Но сама идея-то хороша, согласитесь?

Пожалуй, всё-таки надо подумать. Авось и найдётся обход этих импортов.
Вот он — прорыв года! Сегодня я усну спокойным за судьбу человечества… (кстати как раз недавно думал по этому поводу — «доколе?»)
Oh no! Шесть лет! Шесть! Можете минусовать, но что-то мне подсказывает, что я не зря с Django на RoR перешел… ИМХО, такое медленное развитие не по мне.

Что ни говорите, но настолько долгий процесс внесения изменений ради обратной совместимости — это ужас. RoR живут на edge, но при этом умудряются плагины поддерживать на две ветки.

Надеюсь, Django выберется из болота и начнет обгонять конкурентов семимильными шагами. (=
В RoR зато на обратную совместимость плюют с крыши офиса 37signals.
Скажем так, это утверждение очень голословно.

Во-первых, не надо всюду пихать 37signals. Они не одни Rails продвигают, и DHH сейчас не один core-разработчик, который сделал огромный вклад в Rails — есть еще к примеру Yehuda Katz, Aaron Paterson, Jose Valim, да и многие многие другие.

Во-вторых, как я уже сказал, на обратную совместимость в Rails не плюют, а даже наоборот, но не следуют такой фанатичности как Django. Если обратная совместимость заставляет отказываться от того, чтобы внедрять ежедневно нужные вещи в фреймворк, или не трогать откровенно ужасные и вырвиглазные решения, то такая совместимость не нужна по определению, так как каждый раз писать и прикручивать костыли в каждый проект — извините, у меня нет столько времени.

И может мне кто-нибудь объяснить, откуда пошел такой миф, о том, что в Ruby, и в Rails плюют на обратную совместимость приложений, и что на это смотрят с усмешкой? Раньше тоже верил, только глядя со стороны, но если Вы верите в такой миф — то окунитесь глубже и разберитесь в проблеме, почему фреймворк, который был менее популярен чем Django, сейчас является самым востребованным, и почему заказчики и разработчики по всему миру используют именно его, а не Django. Конечно, советую смотреть не относительно «трендовости» — отбросьте эту чепуху. Советую смотреть по реальным профитам использования инструмента, которые реально котируются в разработке ПО.
>Вы верите в такой миф — то окунитесь глубже и разберитесь в проблеме, почему фреймворк, который был менее популярен чем Django, сейчас является самым востребованным, и почему заказчики и разработчики по всему миру используют именно его, а не Django.

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

А вот по релизящимся и активно развивающимся проектам статистика, на мой взгляд, не столь однозначная.
Так может показаться только человеку далёкому от Django. На самом деле, данный пример не показателен, Django отлично развивается, да и данное нововведение не настолько нужно, насколько просто приятно, поэтому, видимо, с ним и не торопились. Добавление доп. данных к юзеру и раньше вполне решалось, пусть и не столь элегантно.
На данный момент — да, уже полгода как отдалился (=

Django развивается, и я с этим совсем не спорю, но просто расширив свой кругозор, поработав на Rails, Flask, покопавшись в Pylons и Pyramid наконец, я понял, что Django — дает мне только 10 процентов того, что мне действительно нужно ежедневно. И модель ее развития меня совершенно не устраивает в плане использования ее как инструмента.

У меня свои оскомины, и мое мнение остается моим мнением (= Холивары разводить не собираюсь и не хочу, лишь высказал свое IMHO.

Просто в один момент, настал момент, когда я начал смотреть, и понял, что вот эти вещи делать можно, но не элегантно, и тут надо бы свое напильником допиливать, да и тут не совсем то, что хочу, а тут ад с формами, а тут это не устраивает, а это неудобно. Django — великолепный инструмент, но не настолько элегантный, чтобы я его любил и дальше.
Ещё из заметных фишек в 1.5 обещают встроенную систему миграций. Пилит кажется один из авторов South.
Ну, и экспериментальная поддержка Py3k.
Меня бы полностью устроил просто включенный south. Впрочем, south включить столь несложно, так что ничего трогать не надо.
Имхо, миграции south ужасны, у django-evolution более красивый подход. Лучше бы они как-то иначе их делали, чем просто включали south в релиз
А что с ними не так?
Ну есть затыки с null/blank или там проблема отсутствия кастом библиотек кроме datetime при запуске. Но для питониста это самый простой класс проблем, можно написать препроцессор для миграций (так и ренеймы полей можно делать) или прогрузить библиотеки из __init__.py.
Но благодаря ему я застрахован от более важного класса проблем, когда что-то не то происходит с базой (сбиваются привязки, дохнут индексы и т.д.)
Ну, когда пытаешься развернуть с нуля приложение, в котором когда-то использовались миграции, приходится, как минимум вырубать south нафиг, что уеже костыль.

>Но для питониста это самый простой класс проблем, можно написать препроцессор для миграций (так и ренеймы полей можно делать) или прогрузить библиотеки из __init__.py.

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


Чукча не читатель, чукча писатель :)

Для таких случаев есть опция --fake
Хм, спасибо, но я так понимаю, что все равно придется запускать миграции для все приложений подряд >.> пусть и с этим флагом
Запускать с этим флагом нужно только те миграции, которые конфликтуют. Обычно так бывает при конкурентной разработки одного приложения несколькими программистами. Конфликты, как правило, разрешаются на раз-два.
>Ну, когда пытаешься развернуть с нуля приложение, в котором когда-то использовались миграции, приходится, как минимум вырубать south нафиг, что уеже костыль.

А что именно при этом мешает?

>Такие решения должны работать из коробки

По моему скромному мнению, многие вещи лучше контролировать вручную, меньше проблем будет. Например если одно поле заменилось кастом-полем или есть разрыв в истории миграций. Мне при таких случаях вообще не интересно, что авторы коробки по этому поводу предполагали, если это отличается от «не трогать».
Вручную — можно и INSERT руками тогда делать :)
Юмор понял, но если авторы при необходимости INSERT пытаются творить какую-то «магию», то я лучше сделаю его сам :)
У эволюшена более красивый? Интересно, чем же. И вообще, он разве ещё развивается?
Нет, он, к сожалению, загнулся.
Ну почему же к сожалению :-)
вроде писали недавно, что в 1.5 вряд ли миграции будут
Я не в курсе, как там формируется релиз. Просто увидел pull request внушительных размеров, решил, что его скоро вольют в основную ветку.
Ага, еще через пару лет уберут захардкоженый html из форм.
И осознают, что свою админку они лепили вообще без понимания того, как должен быть устроен front-end, свое мнение о которой (экрана на три) я осталю при себе, отослав к мнению sehmachine.

После косой дюжины очень разных проектов на Django, я пришел к выводу, что теперь мы окончательно счастливы вместе с Tornado ws
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории