JOT*_*JOT 1 python post google-app-engine newline
我正在 Google App Engine 上构建一个 REST API(不使用端点),它将允许用户上传 CSV 或制表符分隔的文件并搜索潜在的重复项。由于它是一个 API,我不能使用<form>s 或 BlobStore 的upload_url. 我也不能依赖一个调用这个 API 的 Web 客户端。相反,理想情况下,用户将body在请求中发送文件。
我的问题是,当我尝试读取制表符分隔文件的内容时,我发现所有换行符都已删除,因此无法将内容拆分为行。
如果我直接在 Python 解释器上检查文件的内容,我会看到有制表符和换行符(示例中的输出被截断)
>>> with open('./data/occ_sample.txt') as o:
... o.read()
...
'id\ttype\tmodified\tlanguage\trights\n123456\tPhysicalObject\t2015-11-11 11:50:59.0\ten\thttp://creativecommons.org/licenses/by-nc/3.0\n...'
Run Code Online (Sandbox Code Playgroud)
该RequestHandler记录的请求主体的内容:
import logging
class ReportApi(webapp2.RequestHandler):
def post(self):
logging.info(self.request.body)
...
Run Code Online (Sandbox Code Playgroud)
所以当我调用在dev_appservervia中运行的API时curl
curl -X POST -d @data/occ_sample.txt http://localhost:8080/api/v0/report
Run Code Online (Sandbox Code Playgroud)
这显示在日志中:
id type modified language rights123456 PhysicalObject 2015-11-11 11:50:59.0 en http://creativecommons.org/licenses/by-nc/3.0
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,有标题的最后一个值和第一条记录(之间没有任何东西rights,并123456分别),并与每个记录的最后一个值和下的第一个同样的情况。
我在这里遗漏了一些明显的东西吗?我尝试使用self.request.body,self.request.body_file和加载数据self.request.POST,但似乎都不起作用。我还尝试在请求标头中应用Content-Type值text/csv, text/plain,application/csv但没有成功。我应该添加一个不同的Content-Type吗?
您使用了错误的curl命令行选项来发送文件数据,正是这个选项正在剥离换行符。
该-d选项解析您的数据并发送application/x-www-form-urlencoded请求,并去除换行符。从curl联机帮助页:
-d, --data <data>[...]
如果您以字母开头数据
@,则其余部分应该是从中读取数据的文件名,或者-如果您希望 curl 从标准输入读取数据。也可以指定多个文件。'foobar'因此,从名为的文件中发布数据将使用--data @foobar. 当--data被告知从这样的文件中读取时,将删除回车符和换行符。
大胆强调我的。
请改用该--data-binary选项:
--data-binary <data>(HTTP) 这完全按照指定的方式发布数据,没有任何额外的处理。
如果数据以字母开头
@,则其余部分应该是文件名。数据以与此类似的方式发布--data-ascii,除了保留换行符和回车符并且从不进行转换。
在这种情况下,您可能希望包含一个Content-Type标题;当然,这取决于您的处理程序,如果您关心该标头。
| 归档时间: |
|
| 查看次数: |
1026 次 |
| 最近记录: |