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 и не смогли его воссоздать.

  • проблема с кодировкой python для mssql
  • Запись больших данных данных Pandas в базу данных SQL Server
  • Доступ к локальной базе данных SQL Server 2008 с помощью pyobbc в Windows 7
  • Как вы получаете выходные параметры из хранимой процедуры в Python?
  • используя pyodbc на ubuntu для вставки поля изображения на SQL Server
  • Использование Sql Server с Django в производстве
  • Pypyodbc: Не удается открыть ошибку lib 'FreeTDS': file not found ") при попытке подключения к SQL-серверу
  • используя pyodbc на linux для вставки символов unicode или utf-8 в поле nvarchar mssql
  • Подключение к MS SQL Server с использованием python в Linux с помощью «учетных данных Windows»
  • python и pymssql
  • Ошибка: Не удалось найти vcvarsall.bat при установке PyMSSQL-2.0.0b1 ... что мне не хватает?
  •  
    Interesting Posts for Van-Lav

    Как изменить переменную после того, как она уже определена в Python

    Используя ту же опцию несколько раз в Argparse Python

    Суммирование массивных сумм с весами

    Рекурсивный обход графа: как генерировать и возвращать все пути?

    matplotlib только рабочие дни без выходных по оси x с plot_date

    Построение графика по осям, но получение результатов при попытке классифицировать изображение на основе функций HoG

    Re.match () возвращает всегда none

    Как исходный код Python «free_list = (PyIntObject *) Py_TYPE (v);» переместить указатель free_list на следующий объект?

    ValueError: unichr () arg не в диапазоне (0x10000) (узкая сборка Python)

    Как сделать токенирование строкового предложения в NLTK?

    добавление заголовка в модуль запроса python

    rpy2 Ошибка: «непризнанный escape в символьной строке»

    Использование нескольких серверов memcache в пуле

    Как узнать, существует ли слово на английском языке, используя nltk

    PIL Лучший способ заменить цвет?

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