我试图通过使用Falcon Framework作为后端来接收PDF文件。我是后端的初学者,并试图了解正在发生的事情。因此,总结,有两个类。其中一个是我正在工作的朋友。
这是后端侧代码:
#this is my code
class VehiclePolicyResource(object):
def on_post(self, req, resp, reg):
local_path = create_local_path(req.url, req.content_type)
with open(local_path, 'wb') as temp_file:
body = req.stream.read()
temp_file.write(body)
#this is my friend code
class VehicleOdometerResource(object):
def on_post(self, req, resp, reg):
local_path = create_local_path(req.url, req.content_type)
with open(local_path, 'wb') as temp_file:
body = req.stream.read()
temp_file.write(body)
完全相同,没有给出相同的答案,我通过这样做添加了路线
api.add_route('/v1/files/{reg}/policies',VehicleResourcesV1.VehiclePolicyResource())
并通过在终端中使用此命令:
HTTP POST localhost:5000/v1/files/SJQ52883Y/policies@/Users/alfreddatui/Autoarmour/aa-atlas/static/asd.pdf
它试图获取文件。但是它一直说,不支持媒体类型。当其他代码接收图像(实际上与上述代码相同)时,它起作用。
有什么想法?
falcon可以用Content-Type: application/json
的请求支持。
对于其他内容类型,您需要为您的请求提供媒体处理程序。
这是为Content-Type: application/pdf
请求实施处理程序的尝试。
import cStringIO
import mimetypes
import uuid
import os
import falcon
from falcon import media
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
class Document(object):
def __init__(self, document):
self.document = document
# implement media methods here
class PDFHandler(media.BaseHandler):
def serialize(self, media):
return media._parser.fp.getvalue()
def deserialize(self, raw):
fp = cStringIO.StringIO()
fp.write(raw)
try:
return Document(
PDFDocument(
PDFParser(fp)
)
)
except ValueError as err:
raise errors.HTTPBadRequest(
'Invalid PDF',
'Could not parse PDF body - {0}'.format(err)
)
更新媒体处理程序以支持Content-Type: application/pdf
。
extra_handlers = {
'application/pdf': PDFHandler(),
}
app = falcon.API()
app.req_options.media_handlers.update(extra_handlers)
app.resp_options.media_handlers.update(extra_handlers)
我得到了它,我只是注意到默认情况下猎鹰会收到JSON文件(如果我错了,请纠正我)因此,我需要对PDF和图像文件进行例外。