Как загрузить файл с помощью BlobStore в Python App Engine?

Я сделал все, что указано в документации по движку приложения, но не смог заставить работать blobstore. Может быть, некоторые из вас смогут определить, что я делаю неправильно. Когда я нажал кнопку отправки

Такой URL-адрес виден в адресной строке, а передо мной пустая белая страница.

http://localhost:8080/_ah/upload/agltb2JpbHNvcnVyGwsSFV9fQmxvYlVwbG9hZFNlc3Npb25fXxg9DA

У кого-нибудь есть предложение?

Это мои обработчики:

class MainHandler(webapp.RequestHandler):
  def get(self):
    years = Years.all().order("Year")
    months = Months.all().order("SortNumber")

    upload_url = blobstore.create_upload_url('/imidergi/upload')

    content = {
        'upload': upload_url,
        'yearList':years,
        'monthList':months,
        }

    render_template(self, 'imidergi.html', content)

class AddDergi(blobstore_handlers.BlobstoreUploadHandler):
  def post(self):
    # 'file' is file upload field in the form
    upload_files = self.get_uploads('file')
    blob_info = upload_files[0]

    dergi = Dergiler()
    dergi.Year = self.request.get("yil")
    dergi.Month = self.request.get("ay")
    dergi.DergiPDF = str(blob_info.key())
    dergi.Name = self.request.get("isim")
    dergi.Image = self.request.get("resim")
    dergi.put()

    self.response.out.write(dergi.Name)

И это html, который отображает форму.

<form action="{{ upload }}" method="post" id="dergiform" enctype="multipart/form-data">
  {{ upload }}
  <label>Yil:</label><select name="yil">
  {% for year in yearList %}
    <option value="{{ year.Year }}">{{ year.Year }}</option>
  {% endfor %}
  </select><br/>
  <label>Ay:</label><select name="ay">
  {% for month in monthList %}
    <option value="{{ month.Name }}">{{ month.Name }}</option>
  {% endfor %}
  </select><br/>

  <label>Isim: </label><input type='text' id="isim" name="isim"/><br/>
  <label>Dergi: </label><input type='file' id="file" name="file"/><br/>
  <label>Resim: </label><input type='file' id="resim" name="resim"/><br/>
  <label></label><input type='submit' value='Ekle'/>
</form>

person gurkan    schedule 28.03.2011    source источник
comment
Почему вы храните ключ BLOB-объекта в виде строки? Специально для этой цели существует BlobRefProperty.   -  person Nick Johnson    schedule 29.03.2011


Ответы (1)


IIRC BlobstoreUploadHandler ожидает, что вы вернете перенаправление после обработки POST, поскольку ваш обработчик действительно отвечает специальным серверам загрузки BlobStore, а не напрямую с клиентом/браузером, как в нормальный запрос.

Скопируйте пример из документации blobstore и помните, что вы можете только отвечать заголовками (например, перенаправлениями), а не содержимым тела.

person Chris Farmiloe    schedule 28.03.2011
comment
Спасибо за ваш ответ, но даже я использовал перенаправление, оно все равно не работает. Было бы неплохо, если бы вы могли отправить часть кода, который я должен реализовать, чтобы заставить его работать. Все равно спасибо.. - person gurkan; 28.03.2011
comment
Можете ли вы обновить свой вопрос, чтобы отразить ваш код, который возвращает перенаправление, и я с радостью посмотрю. Также, пожалуйста, исправьте форматирование — код должен содержать четыре пробела, чтобы он отображался правильно - person Chris Farmiloe; 28.03.2011
comment
Не работает как? Вы смотрели журналы и использовали инструменты разработчика Chrome или Firebug, чтобы увидеть, что возвращается? - person Nick Johnson; 29.03.2011