Django 1.3是可以接受的。因此,我可以使用request.raw_post_data或request.read()做一些事情(或其他一些更好的访问方法)。有任何想法吗?
您不希望碰触request.raw_post_data
-这意味着将整个请求正文读入内存,如果您谈论的是文件上传,那么可能很多request.read()
。您也可以使用Django <= 1.2来做到这一点,但这意味着要深入研究HttpRequest
以找出使用私有接口的正确方法,这是一个真正的负担,然后确保您的代码也将与Django> = 1.3兼容。 。
我建议您要做的是复制该类的现有文件上传行为部分MultiPartParser
:
我如何推断正在发送的内容的MIME类型?如果我做对了,那么PUT主体就是没有前奏的文件。因此,我是否要求用户在其标题中指定mime类型?
让客户端在Content- Type标头中指定它,或者使用python的mimetype模块猜测媒体类型。
我很想了解您如何进行此操作-这是我一直在研究自己的意思,如果您能发表评论以告知我进展如何,那就太好了!
根据要求进行 ,这是我所做的,并且完全基于上述内容和django来源。
upload_handlers = request.upload_handlers
content_type = str(request.Meta.get('CONTENT_TYPE', ""))
content_length = int(request.Meta.get('CONTENT_LENGTH', 0))
if content_type == "":
return HttpResponse(status=400)
if content_length == 0:
# both returned 0
return HttpResponse(status=400)
content_type = content_type.split(";")[0].strip()
try:
charset = content_type.split(";")[1].strip()
except IndexError:
charset = ""
# we can get the file name via the path, we don't actually
file_name = path.split("/")[-1:][0]
field_name = file_name
由于我在此处定义API,因此不必担心跨浏览器的支持。就我的协议而言,不提供正确的信息是一个无效的请求。关于是否要说image/jpeg; charset=binary
或是否允许不存在的字符集,我有两种想法。无论如何,我将设置Content-Type
有效地视为客户端的职责。
同样,对于我的协议,文件名是传入的。我不确定该field_name
参数用于什么,并且源代码没有提供很多线索。
实际上,下面发生的事情比看起来简单得多。您询问每个处理程序是否将处理原始输入。如上述声明所述,默认情况下,您有MemoryFileUploadHandler
&TemporaryFileUploadHandler
。好吧,事实证明,MemoryFileUploadHandler
当被要求创建一个new_file
决定是否将处理文件的决定时(基于各种设置)。如果它决定将要执行的操作,则将引发异常,否则将不会创建该文件,并让另一个处理程序接管该文件。
我不确定目的counters
是什么,但是我从源头上保留了它。其余的应该很简单。
counters = [0]*len(upload_handlers)
for handler in upload_handlers:
result = handler.handle_raw_input("",request.Meta,content_length,"","")
for handler in upload_handlers:
try:
handler.new_file(field_name, file_name,
content_type, content_length, charset)
except StopFutureHandlers:
break
for i, handler in enumerate(upload_handlers):
while True:
chunk = request.read(handler.chunk_size)
if chunk:
handler.receive_data_chunk(chunk, counters[i])
counters[i] += len(chunk)
else:
# no chunk
break
for i, handler in enumerate(upload_handlers):
file_obj = handler.file_complete(counters[i])
if not file_obj:
# some indication this didn't work?
return HttpResponse(status=500)
else:
# handle file obj!