Использование аутентификации пользователя и taggit для нескольких приложений в одном проекте

Предыстория: У меня есть 5 независимых проектов Django. который я пытаюсь объединить в 1 проект Django, состоящий из нескольких приложений.Другими словами: у projA есть appA, у projB есть appB, у projC есть appC и т. д. Мне нужен 1 masterProj, у которого есть ppA, appB и appC.

В настоящее время каждое приложение подключается к собственной независимой базе данных (приложения не обмениваются данными).Каждый проект использует аутентификацию пользователя Django, регистрацию Django, taggit, профили, комментарии и sorl-thumbnail.

Я использую Django 1.4 и настраиваю маршрутизацию базы данных в соответствии с этим ответом stackoverflow, чтобы после объединения в один проект каждое приложение в новом объединенном проекте Django по-прежнему могло подключаться к своей собственной базе данных. . Все прошло гладко, но у меня начались проблемы с такими вещами, как аутентификация пользователя и taggit:

1)Как упоминалось ранее, каждое приложение подключается к отдельной базе данных, и в каждой из этих баз данных есть таблица с именем 'auth_user'. Однако я обнаружил, что все вызовы чтения/записи в таблицу auth_user (независимо от того, какое приложение выполняет вызов чтения/записи) направляются в базу данных по умолчанию (в данном случае базу данных appA):

# settings.py:
DATABASES['default'] = DATABASES['appA']
DATABASE_ROUTERS = ['appA.db.DBRouter', 'appB.db.DBRouter', 'appC.db.DBRouter']

# appA/dbrouterA.py (appB, appC routers are identical this, replacing 'appA' with 'appB', etc.)
class DBRouter(object):
    def db_for_read(self, model, **hints):
        if model._meta.app_label == 'appA':
            return 'appA'
        if model._meta.app_label == 'auth':
            return 'appA'
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label == 'appA':
            return 'appA'
        if model._meta.app_label == 'auth':
            return 'appA'
        return None

2)Предполагая, что маршрутизация работает, если пользователь входит в appA, я не хочу, чтобы он входил в appB. Я видел, как многие люди задают обратный вопрос (они хотят, чтобы их приложения делились учетными данными пользователя), но кто-нибудь успешно использовал аутентификацию пользователя Django в нескольких независимых приложениях в одном проекте? Если да, то как вы это сделали?

3)Я получаю следующую ошибку из моего кода taggit, но я не смог выяснить, как передать параметр "related_name" в taggit. Я использую базовую реализацию taggit — ничего не подклассифицируя:

# appA/models.py
tags = TaggableManager(blank=True)

# appB/models.py
tags = TaggableManager(blank=True)

Ошибка:

appA.userprofile: Accessor for m2m field 'tagged_items' clashes with related m2m field 'TaggedItem.userprofile_set'. Add a related_name argument to the definition for 'tagged_items'.
appB.userprofile: Accessor for m2m field 'tagged_items' clashes with related m2m field 'TaggedItem.userprofile_set'. Add a related_name argument to the definition for 'tagged_items'.

4)У меня начинает возникать ощущение, что объединение всех этих приложений — это скользкий путь; что позже у меня могут возникнуть проблемы с sorl-thumbnail или комментариями, которые еще не появились.Кто-нибудь успешно объединил приложения в один проект? Или я пытаюсь сделать что-то, что Django принципиально не поддерживает?

Заранее спасибо за помощь!

7
задан Community 23 May 2017 в 12:20
поделиться