среда, 20 апреля 2011 г.

Журналирование/логирование


Ниже представлена слегка переделанная функция, взятая вот отсюда:  http://pysi.org/articles/django_and_tornado/
views.py:
 

def userlogpath(user, message):
  #создание директории для записи лога и файла лога
  LOG_DIR = MEDIA_ROOT+'/log'
  LOG_FILE =  LOG_DIR+username+'.log'

  #проверка существования директории (впервые вошел в систему)
  if not os.path.isdir(LOG_DIR):
    os.makedirs(LOG_DIR)


  #задаем свойсива файла логирования
  #вданнои случе его размкщение
  file_handler = logging.handlers.RotatingFileHandler(
    filename = LOG_FILE)#, mode='a+', # имя файла
   #maxBytes = 1000000, # максимально байт в файле
   #backupCount = 1) # максимум файлов

  # задаем режим логирования ('INFO')
  file_handler.setLevel(getattr(logging, 'INFO'))
  #задаем формат логирования (число-месяц-год время) 
  file_handler.setFormatter(
  logging.Formatter('%(asctime)s\t%(levelname)-8s %(message)s',
                               datefmt = '%d-%m-%Y %H:%M:%S'))
  logging.getLogger('').setLevel(logging.INFO)
  #устанавливаем режим добавления в файл
  logging.getLogger('').addHandler(file_handler)

  #записываем информацию
  logging.info(message)

  #закрываем файл
  logging.getLogger('').removeHandler(file_handler)
  file_handler.close()


Это был простой способ. Но можно повыпендриваться и записать основные директории в settings.py, например вот так:

LOG_DIRNAME = 'log'
LOG_DIR = os.path.join( '{user}', LOG_DIRNAME)
LOG_FILENAME = '{user}.log'
LOG_FILE_PATH = os.path.join(MEDIA_ROOT, LOG_DIR, LOG_FILENAME)

#в views.py вызвать вот так:

LOG_FILE = settings.LOG_FILE_PATH.format(user=user.username)
LOG_DIR = os.path.dirname(LOG_FILE)

воскресенье, 17 апреля 2011 г.

Авторизация средствами Django


  В Django есть две таблицы. Это User и Group. Они располагаются в django.contrib.auth. На самом деле там есть еще таблицы, но для создания проверки прав доступа, необходимы эти две.
  В таблице Group, будут содержаться группы пользователей, которые имеют различные правадоступа. В данном случае это:

1. Оператор
2. Пользователь (Юзер)

  Таблица User используется для записи пользователей прошедших аутоинтификацию. Там содержится логин пользователя, который уникален и не повторяется.

  Для работы с этими таблицами необходимо их импортировать:

from django.contrib.auth.models import User, Group

  Далее, при первичной аутоидентификации, данные вносятся в таблици:
# выполняется в блоке try - except, если таблица была пустой и туда ещё не
# вносились записи

try:
    group = Group.objects.get(name='user')
except Group.DoesNotExist:
# вексение групп пользователей
    group = Group(name='operators')
    group.save()
    group = Group(name='users')
    group.save()
try:
    user = User.objects.get(username=username)
except User.DoesNotExist:
# создание записи пользователя
    user = User.objects.create_user(username, '', '')
# внесение в группу номер 2, т.е. 'user'
    user.groups.add(2)


  Таблица User, содержит в себе ссылку на таблицу Group, через встроенную 'подтаблицу'
groups.
  Главное корректно заполнить таблицу Group, а далее, добавление прав доступа осуществляется коммандой add('нмер поля записи в таблице Group, соответсвующий определенной группе пользователей')

  Процедура авторизации имеет следующий вид:

def avtorr(user):
# осуществляется проверка принадлежности копределенной группе пользователей
    return True if user.groups.filter(name='user') else False


  Далее, в тексте программы, вставляется проверка, Она вставляется в начале процедуры, которая обрабатывает html страницы, в которых разграничены права доступа.

if autor(request.user)==False:
    return HttpResponseRedirect(reverse("имя процедуры, обрабатывающей случай когда нет прав доступа к данной странице"))