为了避免重复踩坑,也是为了记录自己的心得,加深对django的理解。于是乎,此篇博文诞生了,欢迎批评指正。博文将列举本人遇到的常见坑,并提供一定的解决办法。本文将持续更新,请各位大佬持续关注,O(∩_∩)O
1、Django Admin登录时,用户名密码正确,却无法完成正常跳转
现象:前端输入django admin的superuser用户名和密码,我确信用户名,密码正确,可就是没法完成登录?气的直哆嗦,虽然后来解决了。发个感慨:有的时候,功能莫名奇妙实现了,没有理解,真的是给自己埋坑了。
一般我们会选择两种方式做认证,一种是使用自定义的认证后端,一种是使用django自带的认证后端;我们的django admin登录时,同样会根据AUTHENTICATION_BACKENDS去做认证的事情。如果不使用自定义的认证后端,直接使用django自带的即可,具体配置如下:
AUTHENTICATION_BACKENDS = (
'comm.ssoauth_backend.SsoAuthBackend',
'comm.admin_backend.AdminAuthBackend',
# 'django.contrib.auth.backends.ModelBackend'
)
上述注释的部分为Django自带的认证后端,把这玩意加上;然后在用户名,密码正确的前提下,就可以登录了。上述非注释的部分为自定义的认证后端,但不管是哪种,只要能返回特定的user对象,anthentication(认证)就是通过的,Django Admin就会认为登录成功了。而自定义认证后端,官网也给了案例代码,具体可以看看我的另一篇博文,重点讲解AUTHENTICATION_BACKENDS;好,回到正题,案例代码是这么写的:
class AdminAuthBackend(object):
"""
Django Admin Auth
"""
def authenticate(self, request, username=None, password=None):
login_valid = (settings.ADMIN_LOGIN == username)
pwd_valid = check_password(password, settings.ADMIN_PASSWORD)
if login_valid and pwd_valid:
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
# Create a new user. There's no need to set a password
# because only the password from settings.py is checked.
user = User(username=username)
user.is_staff = True
user.is_superuser = True
user.save()
return user
return None
def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None
这代码厉害了,仔细看,你会发现,只有当用户名,密码和settings.py文件中,ADMIN_LOGIN指定的用户名和ADMIN_PASSWORD指定的密码才可以登录成功哦,否则登录不会成功。