【问题标题】:Authenticate in Django without a database在没有数据库的情况下在 Django 中进行身份验证
【发布时间】:2016-08-02 01:26:00
【问题描述】:

我有一个 Django 应用程序,它完全从 api 获取数据。所以我不必使用数据库。会话数据存储在签名的 cookie 中。我尝试编写自定义用户模型和自定义身份验证后端,如文档中,但我收到以下错误: django.core.exceptions.ImproperlyConfigured: AUTH_USER_MODEL refers to model 'my_app.MyUser' that has not been installed

我的设置.py:

AUTH_USER_MODEL = 'my_app.MyUser'
AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend',
                           'my_app.backends.LoginAuthBackend',)

models.py:

class MyUser(object):
    def save(self):
        pass
    objects = None
    username = ""

在这里,如果尝试使用 django 中的 AbstractUser 而不是 Object,我会收到以下错误:AttributeError: 'NoneType' object has no attribute '_meta' 或 db 表不退出。

后端.py

class LoginAuthBackend(object):
    def authenticate(self, username=None, password=None):
        if username and password:
           try:
               response = my_auth_function(username, password)
               if response.status_code == 200:
                   token = response.get('my_key')
                   user = MyUser()
                   return user
            except MyCustomException:
                  return None

这让我发疯。看起来没有 DB 的 Django 不好用。

编辑

经过多次尝试,解决此问题的简单方法是从设置中删除 'django.contrib.auth.backends.ModelBackend'AUTHENTICATION_BACKENDSAUTH_USER_MODEL。该模型基本上以相同的方式继续。工作顺利

【问题讨论】:

  • 是的,Django 非常依赖数据库。它是这样设计的。看起来 Django 身份验证系统确实希望您拥有一个用户模型,并且没有它就无法工作。你可以更加努力地欺骗 Django 接受虚假模型,但你必须实现一大堆特定于模型实例和查询集的接口。

标签: python django python-3.x django-authentication


【解决方案1】:

默认的身份验证后端处理器集在AUTHENTICATION_BACKENDS 设置中定义。请参阅 Customizing authentication 的 Django 文档。

默认情况下,AUTHENTICATION_BACKENDS 设置为:

['django.contrib.auth.backends.ModelBackend']

这是检查 Django 用户数据库并查询内置权限的基本身份验证后端。

因此,如果您不想要 django.contrib.auth.backends.ModelBackend 身份验证方法,请将其从列表中删除。您可能希望找到(或创建)一个不同的并将其添加到列表中。

【讨论】:

    猜你喜欢
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 2021-11-16
    • 2020-01-12
    相关资源
    最近更新 更多