timofeydeys
@timofeydeys
Свобода творцов

Как написать свой декоратор в django?

Добрый вечер! Требуется помощь в след вопросе. Я питон совсем недавно начал изучать, и питон тоже.
Есть задача, нужно написать свой декоратор, но сколько не гуглил так и не понял как мне реализовать свою задачу. ПОмогите начинающему, и подробным описанием. Прошу не швыряться и отвечать только если хотите помочь.
В общем есть декоратор login_required
У меня есть стандартная таблица User и моя таблица связанная по FR typeUser. Три типа юзера есть. И мне нужно свой декоратор, к каждому типу. Что бы он сравнивал тип юзера через request, и пропускал к функции если тип совпал.
Как это сделать?
  • Вопрос задан
  • 1287 просмотров
Решения вопроса 1
@deliro
Для начала, расширь модель юзера, чтобы не костылить всякими там таблицами typeUser:
1) В основном app'е (у меня это обычно core) создай модель User, унаследованную от AbstractUser:
from django.db import models
from django.contrib.auth.models import AbstractUser

# Это лучше перенести в отдельный файл consts.py
USER_ADMIN = 'adm'
USER_MANAGER = 'mng'
USER_VASYA = 'vas'

USER_TYPES = (
    (USER_ADMIN, 'Администратор'),
    (USER_MANAGER, 'Менеджер'),
    (USER_VASYA, 'Вася'),
)


class User(AbstractUser):
    type = models.CharField(max_length=3, choices=USER_TYPES)

    class Meta(AbstractUser.Meta):
        swappable = 'AUTH_USER_MODEL'

2) В settings.py добавить:
AUTH_USER_MODEL = 'core.User' # Где core - твой app

3) makemigrations и migrate

Если ещё не добрался до Class Based Views, то самое время.
Делаешь такой, например, миксин:
from django.core.exceptions import PermissionDenied
# тут импорт USER_VASYA

class VasyaRequiredMixin(object):
    def dispatch(self, request, *args, **kwargs):
        if request.user.type != USER_VASYA:
            raise PermissionDenied
        return super(VasyaRequiredMixin, self).dispatch(request, *args, **kwargs)


И все вьюхи, которые доступны только Васе наследуешь ещё и от этого миксина, например так:
class VasyaView(VasyaRequiredMixin, View):
    def get(self, request, *args, **kwargs):
        return HttpResponse('Vasya molodec')
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@nail777
Посмотрите в строну

from django.contrib.auth.decorators import user_passes_test
@user_passes_test(lambda u: u.is_superuser)


позволяет проверить проходит ли пользователь под свои условия
Ответ написан
Комментировать
petermzg
@petermzg
Самый лучший программист
Для такой задачи вам нужна связка decorator + middleware
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы