Я занимаюсь разработкой простого веб-сервера, который обрабатывает связь с браузером через XML.
Чтобы убедиться, что тип переменных правильный, я обертываю (большинство) атрибутов в моих классах через методы получения / установки.Что-то вроде:
class Animal(object):
def __init__(self):
super(Animal, self).__init__()
self.age = None
def setAge(self, age):
try:
self._age = int(age)
except TypeError:
self._age = None
def getAge(self):
return self._age
age = property(getAge, setAge)
На сервере также есть система аутентификации и разрешений (типичный логин / пароль ...).
Допустим, зарегистрированный пользователь не имеет разрешения наустановить возраст животных на сервере, но он пытается (немного хакер, у нас здесь, потому что javascript должен был отключить ввод текста возраста, но это другая проблема) ... Назад кpoint!:
Прямо сейчас, когда я получаю POST, я открываю содержащийся в нем XML и проверяю, пытается ли кто-то установить что-то, на что у него нет разрешения.Что-то вроде:
def receivePOST(request):
xmlTree = Utilities.getXMLTree(request.body)
loggedUser = Utilities.getLoggedUser()
if xmlTree.findtext("age") and not loggedUser.hasPermission("setAge"):
raise Exception("User %s was trying to change the age!!" % loggedUser.userName)
(конечно, на «реальном» сервере гораздо больше, если ... elif ... потому что есть гораздо больше разрешений для проверки)
IМне было интересно, стоит ли ставить такую проверку разрешений в методах получения / установки (ну ... в основном в установщике).Это должно быть что-то вроде этого:
class Animal(object):
def __init__(self):
super(Animal, self).__init__()
self.age = None
def setAge(self, age):
if age is not None:
loggedUser = Utilities.getLoggedUser()
if loggedUser.hasPermission("setAge"):
try:
self._age = int(age)
except TypeError:
self._age = None
else:
raise Exception("User %s was trying to change the age!!" % loggedUser.userName)
else:
self._age = None
С одной стороны, это довольно естественное место, чтобы проверить разрешение, когда вы действительно собираетесь что-то делать.Это также «защитит» все классы на моем сервере гораздо более эффективным способом (что если каким-то образом установить «возраст» без прохождения метода «receivePOST»? ... Не будет проверки прав доступа).тот случай).С другой стороны, это означает, что я могу использовать только свой класс Animal в среде сервера (где у меня есть «loggedUser»).
Кроме того, я прочитал, что свойства должны (в идеале) быть простымии это не очень хорошая практика - начинать загружать получатели / установщики с кодом, который может вызвать много побочных эффектов (некоторые люди говорят, что трудно отследить ошибки, когда код только читает: myDuck.age = 512)
Я не знаю ... Что вы думаете?
Спасибо!
Связанный:
Когда и как использовать свойство встроенной функции() в python
Python @property против производительности метода - какой использовать?