Django实践踩坑大全

为了避免重复踩坑,也是为了记录自己的心得,加深对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指定的密码才可以登录成功哦,否则登录不会成功。

你可能感兴趣的:(Django,Python)