Google app engine 如何使用urlfetch发布静态文件?

Google app engine 如何使用urlfetch发布静态文件?,google-app-engine,post,urlfetch,Google App Engine,Post,Urlfetch,假设我的app.yaml中有以下处理程序: handlers: - url: /img/ static_dir: templates/img 而templates/img文件夹包含文件0001.jpg 以下代码用于发布数据: parameters = {'parm1': 'value1', 'parm2': 'value2'} parameters = urllib.urlencode(parameters) response = urlfetch.Fetch(url, payl

假设我的
app.yaml中有以下处理程序:

handlers:
- url: /img/
  static_dir: templates/img
templates/img
文件夹包含文件
0001.jpg

以下代码用于发布数据:

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

如何将该文件添加到
urlfetch

默认情况下,应用程序无法访问App Engine中的静态文件。如前所述,“静态文件在应用程序的文件系统中不可用”

如果您需要一个文件以静态方式和应用程序可读的方式提供,您可以将
application\u readable:true
添加到
static\u dir
处理程序节

但是,如果您这样做,文件将被上传两次(到您的应用程序的文件系统和提供静态文件的单独文件系统),并且“两次上传都将根据您的代码和静态数据存储资源配额收费”

如果您这样做,您的应用程序代码(假设它位于顶层目录中,
templates
是其子目录)将能够通过以下路径访问您提到的文件(仅供阅读):

path = os.path.join(os.path.dirname(__file__), 'templates/img/0001.jpg')
即使这样,我也不知道你所说的“将该文件添加到urlfetch”是什么意思
urlfetch.Fetch
不接受文件参数。如果您想将文件内容添加到
有效负载中,那么您可能只需要将一个条目(使用您想要使用的名称,并将文件的字节作为值)添加到您正在进行URL编码的字典中即可,例如

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

在呼叫
urlencode

之前,谢谢。是的,我想模拟文件上传,所以文件的内容应该添加到
负载中。但是您的方法不起作用-我已经检查了本地服务器发送的内容-它不会在请求中生成
边界
,因此文件以字符串的形式传递。如果您需要将参数编码为多部分表单数据,您可以使用Python标准库的
电子邮件
包中的功能,或者例如。如何最好地将数据编码为多部分表单数据是一个独立的问题,与您编码的数据来自何处(例如,App Engine中的“静态文件”)或如何使用编码的有效负载(例如urlfetch)无关。好的,
poster
库的使用帮助了我。但是我已经测试过并且-我可以读取文件,即使我没有指示
application\u readable:true
@LA\u,您可能会意外地在本地读取它们,但是,如果它们在静态处理程序指令中,没有
application\u readable:true
,部署时不会上载这些文件,因此您的应用程序代码将无法读取它们。我已重命名该文件,从
app.yaml
中删除该文件夹,并将其上载到生产服务器-可以读取该文件。