Django с несколькими базами данных и конкретными маршрутизаторами приложений не может добавлять пользователей в MSSQL

У нас есть приложение Django, которое подключается к нескольким экземплярам базы данных MS SQL. Для каждого приложения есть router.py, который обрабатывает процессы в каждой базе данных.

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

Встроенные приложения Django перенаправляются в базу данных по умолчанию через этот маршрутизатор:

class DjangoRouter(object): """ A router to control all database operations on models in the auth application. """ def db_for_read(self, model, **hints): """ Attempts to read auth models go to auth. """ app_list = ('auth', 'admin', 'contenttypes', 'sessions',) if model._meta.app_label in app_list: return 'default' return None def db_for_write(self, model, **hints): """ Attempts to write auth models go to auth. """ app_list = ('auth', 'admin', 'contenttypes', 'sessions',) if model._meta.app_label in app_list: return 'default' return None def allow_relation(self, obj1, obj2, **hints): """ Allow relations if a model in the auth app is involved. """ app_list = ('auth', 'admin', 'contenttypes', 'sessions',) if obj1._meta.app_label in app_list and obj2._meta.app_label in app_list: return True return None def allow_migrate(self, db, app_label, model=None, **hints): """ Make sure the auth app only appears in the 'auth' database. """ app_list = ('auth', 'admin', 'contenttypes', 'sessions',) if app_label in app_list: return db == 'default' return None 

Мы используем аутентификацию LDAP и встроенную аутентификацию Django. Идея заключается в том, что пользователи интрасети могут аутентифицироваться на нашем сервере AD. Внешние пользователи могут зарегистрироваться и будут аутентифицироваться с помощью аутентификации Django.

Когда у меня установлена ​​база данных по умолчанию:

 'default': { 'ENGINE': 'sql_server.pyodbc', 'NAME': 'Django', 'USER': '', 'PASSWORD': '', 'HOST': 'sqlbeta', 'PORT': '', }, 

LDAP работает, но я не могу добавить пользователя к аутентификации Django. Администратор отображает сообщение «Успешное», но пользователь не добавляется в базу данных.

Если я переключу базу данных по умолчанию обратно в SQLLite, я могу выполнить аутентификацию против AD и добавить пользователей Django.

Таким образом, я не думаю, что это проблема с файлом routers.py. Я беспокоюсь, что это может быть проблемой с движком sql_server.pyodbc.

РЕДАКТИРОВАТЬ: для каждого запроса здесь задаются настройки базы данных:

 DATABASES = { # 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), # }, 'default': { 'ENGINE': 'sql_server.pyodbc', 'NAME': 'Django', 'USER': '', 'PASSWORD': '', 'HOST': 'sqlbeta', 'PORT': '', }, 'master': { 'ENGINE': 'sql_server.pyodbc', 'NAME': 'master', 'USER': '', 'PASSWORD': '', 'HOST': 'sqlbeta', 'PORT': '', }, 'databaseone': { 'ENGINE': 'sql_server.pyodbc', 'NAME': 'databaseone', 'USER': '', 'PASSWORD': '', 'HOST': 'sqlbeta', 'PORT': '', }, 'databasetwo': { 'ENGINE': 'sql_server.pyodbc', 'NAME': 'databasetwo', 'USER': '', 'PASSWORD': '', 'HOST': 'sqlbeta', 'PORT': '', }, } 

ПРИМЕЧАНИЕ. Я думаю, что это может быть связано с тем, как Django сохраняет новых пользователей. Иди сюда, чтобы посмотреть. Я могу использовать команду createuperuser, чтобы добавить больше суперпользователей, в то время как оба сервера аутентификации находятся на своем месте. Подтвержденный, я могу создавать обычных пользователей через оболочку, но не через админ.

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

Редактировать:

По просьбе АндреяСмили:

Django Admin Добавить пользователя

 class UserCreationForm(forms.ModelForm): """ A form that creates a user, with no privileges, from the given username and password. """ error_messages = { 'password_mismatch': _("The two password fields didn't match."), } password1 = forms.CharField(label=_("Password"), widget=forms.PasswordInput) password2 = forms.CharField(label=_("Password confirmation"), widget=forms.PasswordInput, help_text=_("Enter the same password as above, for verification.")) class Meta: model = User fields = ("username",) def clean_password2(self): password1 = self.cleaned_data.get("password1") password2 = self.cleaned_data.get("password2") if password1 and password2 and password1 != password2: raise forms.ValidationError( self.error_messages['password_mismatch'], code='password_mismatch', ) return password2 def save(self, commit=True): user = super(UserCreationForm, self).save(commit=False) user.set_password(self.cleaned_data["password1"]) if commit: user.save() return user 

ОБНОВИТЬ:

Per @ user1797792, я создал пользовательскую UserCreationForm, чтобы установить значение date_joined , но мы по-прежнему не можем добавлять пользователей через Django Admin.

Соответствующие записи forms.py & admin.py приведены ниже:

 class CustomUserCreationForm(UserCreationForm): now = timezone.now() class Meta: model = User fields = ('username',) def save(self, commit=True): user = super(CustomUserCreationForm, self).save(commit=False) user.date_joined = self.now if commit: user.save() return user class CustomUserAdmin(UserAdmin): add_form = CustomUserCreationForm admin.site.unregister(User) admin.site.register(User, CustomUserAdmin) 

2 Solutions collect form web for “Django с несколькими базами данных и конкретными маршрутизаторами приложений не может добавлять пользователей в MSSQL”

Я думаю, что есть проблема с полями с нулевым значением и ошибкой в ​​UserCreationForm. Я не могу реплицировать эту проблему, так как у меня нет сервера MSSQL.

https://github.com/django/django/blob/1.8.6/django/contrib/auth/models.py#L185

Эта функция используется командой управления. Он генерирует timezone.now () для свойства date_joined , в то время как форма в date_joined просто использует функцию save () для самого объекта, которая этого не делает.

Кажется, что date_joined остается NULL, если вы создаете пользователя на панели администратора. Вы можете проверить, имеет ли этот столбец значение по умолчанию в базе данных MSSQL? И НЕУДАЧНО. Если это не так, и оно не может быть недействительным. Тогда их ложь – ваша проблема.

Затем вы должны отредактировать UserCreationForm. Вот запись StackOverflow, в которой показано, как это сделать.

После выполнения всех предложений, которые были представлены через комментарии и ответы. Мы поняли, что проблема – недокументированная ошибка в библиотеке django-pyodbc-azure .

После вращения базы данных PostgreSQL и подключения нашего приложения Django мы не смогли восстановить эту ошибку. Мы также использовали драйверы FreeTDS / ODBC для разговора с базой данных MSSQL и не смогли его воссоздать.

  • SqlAlchemy эквивалент строки соединения podbcc с использованием FreeTDS
  • Получение сообщений SQL Server с использованием ADO и win32com
  • Python - не удается подключиться к MS SQL
  • Ошибка: Не удалось найти vcvarsall.bat при установке PyMSSQL-2.0.0b1 ... что мне не хватает?
  • Могу ли я использовать pyodbc / freetds и sqlalchemy с десятичными данными в mssql?
  • «Незакрытый кавычек» при подключении к pypyodbc
  • используя pyodbc на ubuntu для вставки поля изображения на SQL Server
  • PyODBC, cursor.execute () не будет вставлять параметры в строку SQL
  •  
    Interesting Posts for Van-Lav

    охват замороженного исполняемого файла

    Как получить ключевое значение в шаблоне django?

    Python для .NET

    Является ли одно подчеркивание «_» встроенной переменной в Python?

    django одно приложение одна модель несколько баз данных

    Как получить Pi-Phase от звука, чтобы получить деструктивное вмешательство в Python

    Классификация с несколькими метками для большого набора данных

    Как исправить ошибку «ValueError: требуется как минимум один массив для конкатенации»

    Conda: установка локального пакета разработки в единую среду conda

    Все возможности разбиения списка на два списка

    Как я должен структурировать и получать доступ к таблице данных, чтобы я мог легко сравнивать подмножества в Python 3.5?

    Разделите все элементы строкового списка

    Seaborn: наложение линейного графика поверх гистограммы

    Парные пары, находящие минимальное использование python

    2 ^ n комбинации Itertools с расширенной фильтрацией

    Python - лучший язык программирования в мире.