无身份验证的Django管理后台

15 投票
6 回答
15203 浏览
提问于 2025-04-18 10:54

有没有简单的方法可以在不需要任何身份验证的情况下使用Django的管理页面?我知道可以用这个方法,但那是针对Django 1.3的。有没有什么变化可以让我在Django 1.6中更容易做到这一点?

我这样做的主要原因是我想尽量减少数据库表的数量,而且我只是想在本地使用,所以不需要任何身份验证(反正我只是在本地主机上运行服务器)。

6 个回答

0

对于较新版本的Django(2.1及以上),你需要做一些这样的操作:

auto_auth.py

class User:
    is_superuser = True
    is_active = True
    is_staff = True
    id = 1
    pk = 1


User.has_module_perms = True
User.has_perm = True


class Middleware(object):
     def __init__(self, get_response):
          self.response = get_response

     def __call__(self, request):
         request.user = User()
         return self.response(request)

另外,别忘了修改你的设置中的中间件,停用 django.contrib.auth,并添加 auto_auth

4

另一个选项允许任何人访问:让第一个用户绕过身份验证

# app/admin.py
from django.contrib.auth.models import User
anonymous_user = User.objects.all().first()
admin.site.has_permission = lambda r: setattr(r, 'user', anonymous_user) or True
5

适用于Django版本 >= 1.10 的接受答案

/[yourapp]/middleware.py:

from django.contrib.auth.models import User

class AuthenticationMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        request.user = User.objects.filter()[0]
        return self.get_response(request)  

[yourproject]/settings.pyMIDDLEWARE 列表中:

  • 注释掉或删除: 'django.contrib.auth.middleware.AuthenticationMiddleware',
  • 添加: '[yourapp].middleware.AuthenticationMiddleware',

这对大多数人来说可能很明显,但请注意,这个解决方案仍然需要至少有一个用户存在。你可以手动创建一个用户,使用命令 python manage.py createsuperuser,或者通过脚本自动创建:

18

这个被接受的答案已经很简单了,不过在我尝试了一下之后发现,从最近的Django版本开始(大概是1.8版本之后,admin.site.has_permission这个功能出现了),你可以不需要中间件就能实现这个功能。

在你项目的urls.py文件里:

from django.contrib import admin

class AccessUser:
    has_module_perms = has_perm = __getattr__ = lambda s,*a,**kw: True

admin.site.has_permission = lambda r: setattr(r, 'user', AccessUser()) or True

# Register the admin views or call admin.autodiscover()

urlpatterns = [
    # Your url configs then...
    url(r'^admin/', admin.site.urls),
]

如果你的AccessUser是从User扩展出来的,那么你可以省略掉__getattr__这一部分,因为它是一种比较绕的方式,用来在调用user.pk或者类似的属性时返回一些东西。

14

创建一个模块 auto_auth.py

from django.contrib.auth.models import User
from django.utils.deprecation import MiddlewareMixin

class AutoAuthMiddleware(MiddlewareMixin):
    def process_request(self, request):
        request.user = User.objects.filter()[0]

在你的 settings.py 文件中编辑 MIDDLEWARE

  • 删除 'django.contrib.auth.middleware.AuthenticationMiddleware'
  • 添加 'auto_auth.AutoAuthMiddleware'

如果你想指定某个用户,可以把 User.objects.filter()[0] 改成其他的。


关于你的评论:是的。如果你想在没有用户的情况下运行 Django 管理后台,可以试试这个:

class User:
    is_superuser = True
    is_active = True
    is_staff = True
    id = 1

def return_true(*args, **kwargs):
    return True
User.has_module_perms = return_true
User.has_perm = return_true

class AutoAuthMiddleware(MiddlewareMixin):
    def process_request(self, request):
        request.user = User()

并且从 INSTALLED_APPS 中移除 'django.contrib.auth'

不过,如果你使用了依赖于认证应用的其他应用,那你可能会遇到麻烦。

撰写回答