2015-09-12 2 views
0

Скажем, у меня есть следующий обработчик в моей app.yaml:Как отправить статический файл с помощью urlfetch?

handlers: 
- url: /img/ 
    static_dir: templates/img 

и что папка templates/img содержит файл 0001.jpg.

Следующий код используется для POST данные:

parameters = {'parm1': 'value1', 
    'parm2': 'value2'} 
parameters = urllib.urlencode(parameters) 
response = urlfetch.Fetch(url, payload=parameters, method=urlfetch.POST, deadline=60) 

Как я должен добавить этот файл в urlfetch?

ответ

0

По умолчанию статические файлы в App Engine: не, доступный приложению. Как the docs объясните: «Статические файлы недоступны в файловой системе приложения».

Если вам нужен файл, чтобы быть как служил статический и считываемого приложением, вы можете добавить application_readable: true к static_dir обработчика строфе.

Однако, если вы сделаете это, снова за документ, файлы будут загружены дважды (в файловую систему вашего приложения и в отдельный, из которых будут загружены статические файлы), и «Обе загрузки загружаются с вашего кода и статические квоты ресурсов хранения данных ".

Если вы это сделаете, ваш код приложения (при условии, что он находится в каталоге верхнего уровня, из которого templates является поддиректорией) сможет получить доступ к файлу, который вы указываете (только для чтения) по пути, указанному :

path = os.path.join(os.path.dirname(__file__), 'templates/img/0001.jpg') 

Даже тогда, я не знаю, что вы подразумеваете под «добавлением этого файла в urlfetch». urlfetch.Fetch не принимает аргумент файла. Если вы хотите добавить содержимое файла в payload, то предположительно вы просто добавите в него запись (с именем, которое вы хотите использовать, и байтами файла в качестве значения) в словарь, который вы используете для этой цели, например

with open(path, 'rb') as f: 
    parameters['data'] = f.read() 

как раз перед вызовом urlencode.

+0

Спасибо. Да, я хочу имитировать загрузку файлов, поэтому содержимое файла должно быть добавлено в «полезную нагрузку». Но ваш подход не работает - я проверил, что отправляет локальный сервер - он не генерирует 'рубеж' в запросе, поэтому файл передается как строка. –

+0

Если вам нужно кодировать параметры как данные в виде многостраничной формы, вы можете использовать функциональность из пакета электронной почты стандартной библиотеки Python или, например, рецепт по адресу http://code.activestate.com/recipes/578668-encode-multipart-form -data-for-uploading-files-via /. Как лучше всего кодировать данные в виде многостраничных данных, это отдельная проблема с той, из которой происходит кодирование данных (например, «статический файл» в App Engine) или как вы используете кодированную полезную нагрузку (например, для urlfetch). –

+0

ОК, использование библиотеки 'poster' помогло мне. Но я тестировал и - я могу читать файлы, даже если я не указываю 'application_readable: true'. –

Смежные вопросы