如何使用django进行日志记录?

时间:2018-04-23 15:04:37

标签: django authentication logging django-debug-toolbar

我正在测试我自己的身份验证后端,如here所述。我添加了一些日志记录。请排除我所知道的这两个问题:

  • 我正在使用root记录器(坏)
  • 我使用error日志级别(错误)

(我只是想知道为什么我的日志消息没有显示,并且想确保我正在使用工作记录器/级别)

import logging

from django.conf import settings
from django.contrib.auth.hashers import check_password, make_password
from django.contrib.auth.models import User


class SettingsBackend:
    """
    Authenticate against the settings ADMIN_LOGIN and ADMIN_PASSWORD.

    Use the login name and a hash of the password. For example:

    ADMIN_LOGIN = 'admin'
    ADMIN_PASSWORD = 'pbkdf2_sha256$30000$Vo0VlMnkR4Bk$qEvtdyZRWTcOsCnI/oQ7fVOu1XAURIZYoOZ3iq8Dr4M='
    """

    def authenticate(self, request, username=None, password=None):
        logging.error('authenticate')
        login_valid = (settings.ADMIN_LOGIN == username)
        pwd_valid = check_password(password, settings.ADMIN_PASSWORD)
        logger.error('username={} login_valid={} pwd_valid={}'.format(username, login_valid, pwd_valid))
        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):
        logging.error('get_user')
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

    def has_perm(self, user_obj, perm, obj=None):
        logging.error('has_perm')
        return user_obj.username == settings.ADMIN_LOGIN

我已将此设置为我唯一的身份验证后端:

AUTHENTICATION_BACKENDS = (
    'extras.auth.SettingsBackend',
    # 'django.contrib.auth.backends.ModelBackend',
    # 'allauth.account.auth_backends.AuthenticationBackend',
)

我已经配置了我的管理员用户:

# Used by SettingsBackend

ADMIN_LOGIN = 'admin'
ADMIN_PASSWORD = 'pbkdf2_sha256$36000$9pA3fTzM4yL9$whatever'

我在这里遇到很多问题:

  1. 日志条目未显示,也未被django调试工具栏拦截。
  2. 身份验证根本不起作用。即使强制 login_valid = Truepwd_valid = True,我也无法获得经过身份验证的用户。
  3. 我知道authenticate方法被点击了,因为如果我重命名它,我会得到一个异常('SettingsBackend' object has no attribute 'authenticate'),正如预期的那样。

    我有两个问题:

    第一个问题:如何显示日志条目?把它们放在顶级作品中!如下所示:

    import logging
    
    from django.conf import settings
    from django.contrib.auth.hashers import check_password, make_password
    from django.contrib.auth.models import User
    
    logging.error('Loading module')
    
    ...
    

    正如预期的那样(曾经,当模块加载时),这给了我:

    ERROR:root:Loading module
    

    第二个问题:为什么authenticate方法失败了? (这不是那么重要,我想一旦我开始记录工作,我就能找出它有什么问题)

    注意:对于记录,应用程序在wsgi下以gunicorn app运行。

    修改

    我正在使用:

    • Django 1.10.8
    • Python 3.5.2

1 个答案:

答案 0 :(得分:0)

问题与Django版本的降级有关,从Django 1.11降至Django 1.10authenticate方法的签名已更改。它正在被访问,但不知何故它没有被执行,并且没有生成日志条目。

我不完全理解为什么:

  1. authenticate方法未执行。签名已更改,但它具有默认值,它应该仍然有效(将错误的值分配给参数)
  2. 如果某些事情妨碍了authenticate方法的执行,为什么没有生成异常?
  3. 无论如何,在将签名改编为Django 1.10预期的签名后,一切都按预期开始工作。