TL; DR Я обнаружил, что это проблема с некоторым облачным программным обеспечением, которое моя работа предоставляет под названием Cylance. Он определяет, что Meteor представляет собой вредоносный эксплойт, и убивает процесс всякий раз, когда я пытаюсь запустить команду.
Этапы отладки Чтобы выяснить, почему этот процесс был убит, я пошел на консоль macOS и запустил команду meteor create ~/myApp
, процесс с именем CylanceSvc зарегистрировал сообщение «Слишком много запрошенные группы (65). Может вызвать проблемы с производительностью, когда задействованы сетевые каталоги. " Тогда следующая запись была:
Process:terminated path:/{user}/.meteor/packages/meteor-tool/.1.8.0_2.cty1uc.prsil++os.osx.x86_64+web.browser+web.browser.legacy+web.cordova/mt-os.osx.x86_64/dev_bundle/bin/node pid: violation:None occurences:1 SHA:
Когда я открыл программу Cylance, она упомянула, что она успешно заблокировала эксплойт. Я думаю, пришло время поговорить с ИТ. Я надеюсь, что это поможет кому-то еще прийти сюда.
def clean_status(self):
status = self.cleaned_data.get('status')
if status == 'pending':
if self.instance and self.instance.status == 'activated':
raise forms.ValidationError('You cannot change activated to pending')
return status
This method is to be added in a Form
subclass. Its name is clean_FIELD_NAME
.
cleaned_data
contains previous values. New value is stored in self.instance
.
Alternatively, validate()
method can be added to a forms.Field
subclass. See Django documentation.
Вы можете сделать это в замещенном методе save
, Следует помнить, что экземпляры модели Django не являются фактическими объектами базы данных, они просто получают свои значения оттуда при загрузке. Таким образом, вы можете легко вернуться к базе данных перед сохранением текущего объекта, чтобы получить существующие значения.
def save(self, *args, **kwargs):
if self.status == 'pending':
old_instance = MyClass.objects.get(pk=self.pk)
if old_instance.status == 'activated':
raise SomeError
super(MyModel, self).save(*args, **kwargs)
В настоящее время нет другого хорошего способа вернуть пользователю сообщение об ошибке, кроме создания исключения. В настоящее время разрабатывается проект Google Summer of Code, чтобы включить «проверку модели», но он будет готов через несколько месяцев.
Если вы хотите сделать что-то подобное в админке, лучший способ - определить пользовательский ModelForm с переопределенным методом clean ()
. Тем не мение, на этот раз, поскольку это форма, у вас уже есть доступ к старым значениям без повторного нажатия db. Еще одно преимущество заключается в том, что вы можете вернуть пользователю ошибку проверки формы.
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
def clean_status(self):
status = self.cleaned_data.get('status', '')
if status == 'pending':
if self.instance and self.instance.status == 'activated':
raise forms.ValidationError(
'You cannot change activated to pending'
)
return status
class MyModelAdmin(forms.ModelAdmin):
form = MyModelForm
model = MyModel
Разве это не подходящее место для использования сигналов вместо переопределения метода сохранения? Перехватить сохранение перед фиксацией, проверить текущее значение в базе данных и либо переслать сохранение, либо отклонить его?
Теперь я не уверен, блокирует ли сигнал запрос на сохранение или это происходит асинхронно, так что не стесняйтесь отклонить этот ответ, если сигнал не может быть использован для предотвращения сохранения при проверке.
Я против переопределения встроенных методов, если есть другой встроенный инструмент, который работает так же хорошо.