无身份验证的Django管理后台
有没有简单的方法可以在不需要任何身份验证的情况下使用Django的管理页面?我知道可以用这个方法,但那是针对Django 1.3的。有没有什么变化可以让我在Django 1.6中更容易做到这一点?
我这样做的主要原因是我想尽量减少数据库表的数量,而且我只是想在本地使用,所以不需要任何身份验证(反正我只是在本地主机上运行服务器)。
6 个回答
对于较新版本的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
。
另一个选项允许任何人访问:让第一个用户绕过身份验证
# 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
适用于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.py
的 MIDDLEWARE
列表中:
- 注释掉或删除:
'django.contrib.auth.middleware.AuthenticationMiddleware',
- 添加:
'[yourapp].middleware.AuthenticationMiddleware',
这对大多数人来说可能很明显,但请注意,这个解决方案仍然需要至少有一个用户存在。你可以手动创建一个用户,使用命令 python manage.py createsuperuser
,或者通过脚本自动创建:
这个被接受的答案已经很简单了,不过在我尝试了一下之后发现,从最近的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或者类似的属性时返回一些东西。
创建一个模块 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'
不过,如果你使用了依赖于认证应用的其他应用,那你可能会遇到麻烦。