【问题标题】:Auth user Django in another database在另一个数据库中验证用户 Django
【发布时间】:2019-07-29 13:03:38
【问题描述】:

在同一个项目中,我有一些应用程序应该将数据存储在 localhost 数据库中,而另一些应用程序应该将数据存储在远程数据库中。

我创建了一个routers.py 文件并将其导入我的settings.py。我还在我的设置文件中定义了 2 个数据库。这是正确的吗?

在某些模型/类上,我设置了app_label = 'remote_db',我需要将数据写入远程数据库。

settings.py的一部分

DATABASES={
    'default':{
        ...
    },
    'remote_db':{
        ...
    }
}
DATABASE_ROUTERS = ['smart.routers.AccessRouter',]
AUTH_USER_MODEL = 'users.SmartUser'
AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
)

users/models.py的一部分

class SmartUser(AbstractBaseUser, PermissionsMixin):
    class Meta:
        app_label = 'remote_db'

当我尝试run makemigrations users 时,我收到以下错误:

AUTH_USER_MODEL 指的是尚未安装的模型 '%s'" % settings.AUTH_USER_MODEL django.core.exceptions.ImproperlyConfigured:AUTH_USER_MODEL 指的是尚未安装的模型“users.SmartUser”

【问题讨论】:

    标签: django authentication


    【解决方案1】:

    如果您有将存在于其他地方的表/模型,您需要告诉 Django 它们不是托管模型。

    在你的models.py 中有这样的东西:

    class SomeClass(models.Model):
        id = models.IntegerField(db_column="id", primary_key=True)
        ...other attributes...
    
        class Meta(object):
            db_table = "your_table_for_this_model"
            managed = getattr(settings, "UNDER_TEST", False) 
    

    我使用一个名为“UNDER_TEST”的全局变量,以便在运行我们的测试时,django 将管理模型并创建测试表。如果您的数据库允许创建测试表,您可能不必这样做。我们的数据库受到严格管理,并且禁止创建测试表,因此我们使用这种解决方法来确保我们可以创建/运行测试以保持我们的代码被覆盖/测试。

    在您的情况下,它只是一个 User 模型(我们也将它放在一个带有它自己的表的单独数据库中)我们有这样的:

    class User(AbstractUser):
    ...our attributes...
    
    class Meta:
        db_table = "ourApp_user"
    

    这就是我们User 模型的专业内容。

    我们的设置和你一样,但是我们不使用DATABASE_ROUTERS

    AUTH_USER_MODEL = 'users.User'
    AUTHENTICATION_BACKENDS = (
        'django.contrib.auth.backends.ModelBackend',
    )
    
    "default": {
        "ENGINE": "sql_server.pyodbc",
        "NAME": os.environ.get("default_NAME"),
        "HOST": os.environ.get("default_HOST"),
        "USER": os.environ.get("default_USER"),
        "PASSWORD": os.environ.get("default_PASSWORD"),
        "PORT": os.environ.get("default_PORT"),
        "OPTIONS": {
            "host_is_server": True,
            "driver": "ODBC Driver 13 for SQL Server",
        },
        "TEST": {
            "ENGINE": "django.db.backends.sqlite3",
            "NAME": os.path.join(BASE_DIR, "default-db.sqlite3"),
        },
    },
    "other_db": {
        "ENGINE": "sql_server.pyodbc",
        "NAME": os.environ.get("other_db_NAME"),
        "HOST": os.environ.get("other_db_HOST"),
        "USER": os.environ.get("other_db_USER"),
        "PASSWORD": os.environ.get("other_db_PASSWORD"),
        "PORT": os.environ.get("other_db_PORT"),
        "OPTIONS": {
            "host_is_server": True,
            "driver": "ODBC Driver 13 for SQL Server",
        },
        "TEST": {
            "ENGINE": "django.db.backends.sqlite3",
            "NAME": os.path.join(BASE_DIR, "other-db.sqlite3"),
        },
    },
    

    尝试删除 app_label 并放入 db_table,或离开 app_label 并放入 db_table 以明确告诉它应该查看哪个表。

    如果它是一个表格,你将通过其他方式填充,并且如果你不希望 Django 管理其中的数据(例如:如果你有一个脚本生活在其他地方填充一个特定的表格您的应用需要引用)。

    【讨论】:

      猜你喜欢
      • 2018-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-20
      • 2016-01-20
      • 1970-01-01
      • 2012-09-20
      相关资源
      最近更新 更多