没有身份验证的Django Admin

pse*_*117 8 python django

有没有一种方法可以在没有任何形式的身份验证的情况下使用Django管理页面?我知道我可以使用这种方法,但这适用于Django 1.3.是否有任何变化可以让我在Django 1.6中更容易地做到这一点?

我的主要动机是我想拥有尽可能少的数据库表,而我只在本地使用它,所以不需要任何形式的身份验证(我只是在localhost上运行服务器).

Jam*_*urn 9

创建一个模块auto_auth.py:

from django.contrib.auth.models import User

class Middleware(object):
    def process_request(self, request):
        request.user = User.objects.filter()[0]
Run Code Online (Sandbox Code Playgroud)

MIDDLEWARE_CLASSES在您的编辑settings.py:

  • 去掉 'django.contrib.auth.middleware.AuthenticationMiddleware'
  • 'auto_auth.Middleware'

User.objects.filter()[0]如果您想要特定用户,可以更改为其他内容.


回应你的评论:是的.试试这个:

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 Middleware(object):
    def process_request(self, request):
        request.user = User()
Run Code Online (Sandbox Code Playgroud)

'django.contrib.auth'从中删除INSTALLED_APPS

但是如果您使用任何依赖于auth应用程序的应用程序,那么您将度过一段美好时光.

  • 这个答案已经过时了。 (2认同)

小智 8

接受的答案已经非常简单了但是在搞清楚之后我发现在最近的Django版本中(因为admin.site.has_permission成为了一个东西......> = 1.8?)你可以在没有中间件的情况下做到这一点.

在你的项目的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),
]
Run Code Online (Sandbox Code Playgroud)

如果你有AccessUser扩展用户,你可以省去__getattr__一个hacky方式的部分,当调用user.pk或类似的东西时返回一些东西.

  • 请注意,当尝试使用此构造更改某些内容时,django 管理员会抱怨:`在表“django_admin_log”上插入或更新违反了外键约束“django_admin_log_user_id_c564eba6_fk_auth_user_id”详细信息:表“auth_user”中不存在键(user_id)=(1) .`,所以如果您需要该功能,您确实需要有一个用户。 (2认同)

hel*_*lbe 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)  
Run Code Online (Sandbox Code Playgroud)

[yourproject]/settings.pyMIDDLEWARE列表:

  • 评论或删除: 'django.contrib.auth.middleware.AuthenticationMiddleware',
  • 附加: '[yourapp].middleware.AuthenticationMiddleware',

对于大多数人来说可能很明显,但请注意,该解决方案仍然需要一个用户存在。python manage.py createsuperuser使用脚本手动或自动创建一个: