Ошибка подозрительной операции при попытке прочитать значение по умолчанию для поля файла django

Мне нужно настроить модель с FileField в django, но если пользователь не дает значение, я должен установить значение по умолчанию.

Тем не менее, мое определение модели следующее

class AutoAttendant(models.Model):
    name = models.CharField(max_length=32)
    t_menu_id = models.IntegerField()
    t_menu_prompt = models.FileField(upload_to='user_menus', default='%suser_menus/ringtu_default.mp3' % settings.MEDIA_URL, \
            blank=True, null=False)

Я читал, и django запрещает доступ к этому полю по любому другому пути, а не указанному в параметре upload_to, поэтому я думаю, что это должно быть правильно

Но тогда мне нужно прочитать этот файл и отправить его на внешнюю веб-службу, и когда я делаю следующее:

send_to_ws(autoattendant_instance.t_menu_prompt.path)

я получаю ошибку SuspiciousOperation, есть какие-нибудь подсказки?

Большое тебе спасибо.

РЕДАКТИРОВАТЬ: добавление дополнительной информации

Вот что делает send_to_ws:

def add_menu(self, filepath, menu='ROOT'):
    method = self.service.set_menu_prompt
    f = open(filepath, 'rb')
    data = f.read()
    mime_type = 'audio/mpeg'
    bin_param = (data, mime_type)
    request = self.factory.create('ns0:SetMenuPromptRequest')
    request.i_menu = self.get_menu_id(menu)
    request.prompt_type = 'menu'
    request.prompt = f.name.split('/')[-1]

    response = attach(method, bin_param, ATT_EP, request)
    return response

В этой функции я создаю объект suds soap_request и прикрепляю файл как двоичное вложение.

Я думаю, что настоящая проблема в том, что я открываю (файл) непосредственно в этой функции, есть ли способ обойти это?

также, вот трассировка

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/account/finish/

Django Version: 1.5
Python Version: 2.7.3
Installed Applications:
('django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.admin',
 'django.contrib.admindocs',
 'gunicorn',
 'django_extensions',
 'south',
 'compressor',
 'ringtu',
 'localization',
 'profiles',
 'services')
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware')


Traceback:
File "/home/israelord/.virtualenvs/ringtu-env/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  115.                         response = callback(request, *callback_args, **callback_kwargs)
File "/home/israelord/.virtualenvs/ringtu-env/local/lib/python2.7/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
  25.                 return view_func(request, *args, **kwargs)
File "/home/israelord/Work/RingTu/proyecto/code/profiles/views.py" in account_finish
  351.     upload = ph.add_menu(user)
File "/home/israelord/Work/RingTu/proyecto/code/profiles/helpers.py" in add_menu
  57.     response_upload = attwpr.add_menu(att)
File "/home/israelord/Work/RingTu/proyecto/code/services/decorators.py" in _wrap
  33.             result = f(*args, **kwargs)
File "/home/israelord/Work/RingTu/proyecto/code/services/autoattendant_wrapper.py" in add_menu
  111.         data = att_instance.t_menu_prompt.read()
File "/home/israelord/.virtualenvs/ringtu-env/local/lib/python2.7/site-packages/django/core/files/utils.py" in <lambda>
  16.     read = property(lambda self: self.file.read)
File "/home/israelord/.virtualenvs/ringtu-env/local/lib/python2.7/site-packages/django/db/models/fields/files.py" in _get_file
  46.             self._file = self.storage.open(self.name, 'rb')
File "/home/israelord/.virtualenvs/ringtu-env/local/lib/python2.7/site-packages/django/core/files/storage.py" in open
  36.         return self._open(name, mode)
File "/home/israelord/.virtualenvs/ringtu-env/local/lib/python2.7/site-packages/django/core/files/storage.py" in _open
  159.         return File(open(self.path(name), mode))
File "/home/israelord/.virtualenvs/ringtu-env/local/lib/python2.7/site-packages/django/core/files/storage.py" in path
  259.             raise SuspiciousOperation("Attempted access to '%s' denied." % name)

Exception Type: SuspiciousOperation at /account/finish/
Exception Value: Attempted access to '/media/user_menus/ringtu_default.mp3' denied.

person iferminm    schedule 05.06.2013    source источник
comment
Но модель правильно принимает файл по умолчанию, не так ли?   -  person Paulo Bu    schedule 05.06.2013
comment
правильно, я могу правильно получить объект filedfile   -  person iferminm    schedule 05.06.2013
comment
Таким образом, заголовок вашего вопроса вводит в заблуждение, как и его содержание. Можете ли вы опубликовать источник send_to_ws?   -  person Paulo Bu    schedule 05.06.2013
comment
Каково значение MEDIA_URL и MEDIA_ROOT? Кроме того, если там нет конфиденциальной информации, возможно, предоставление трассировки может помочь диагностировать вашу проблему.   -  person Salem    schedule 05.06.2013
comment
URL-адрес носителя: '/media/', а также статический URL-адрес /static/, но я установил корни, используя os.path.join(os.path.dirname(__file__), 'media/') и сделал то же самое с статический, это неправильно?   -  person iferminm    schedule 05.06.2013
comment
Ну, вам не нужно open файл, если вместо пути вы передаете файловое поле autoattendant_instance.t_menu_prompt, вы также можете сделать autoattendant_instance.t_menu_prompt.read(), вы можете попробовать это, также будет полезен Traceback.   -  person Paulo Bu    schedule 05.06.2013
comment
Все еще есть та же проблема, я отправил трассировку, большое спасибо.   -  person iferminm    schedule 05.06.2013
comment
Это странно, потому что это работает, если я устанавливаю значение в поле, но оно терпит неудачу при попытке прочитать значение по умолчанию.   -  person iferminm    schedule 05.06.2013


Ответы (1)


В конце концов, проблема заключалась в определении атрибута upload_to в моем FileField().

Я так делал сначала

class AutoAttendant(models.Model):
    name = models.CharField(max_length=32)
    t_menu_id = models.IntegerField()
    t_menu_prompt = models.FileField(upload_to='user_menus', default='%suser_menus/ringtu_default.mp3' % settings.MEDIA_URL, \
            blank=True, null=False)

И вот как я изменил его благодаря некоторым ответам на этот вопрос Подозрительная операция Django

class AutoAttendant(models.Model):
    name = models.CharField(max_length=32)
    t_menu_id = models.IntegerField()
    t_menu_prompt = models.FileField(upload_to='user_menus/', default='%suser_menus/ringtu_default.mp3' % settings.MEDIA_URL, \
                                     blank=True, null=False)

обратите внимание на косую черту в конце определения upload_to.

Я понятия не имею, почему это работает сейчас, я думаю, я покопаюсь в этом позже

person iferminm    schedule 07.06.2013