use*_*876 22 django http http-headers
Django中是否存在HTTP字节范围的现有实现?即当客户端发送Range:标头时,我希望我的Django应用程序接受它并使用HTTP"206 Partial Content"响应进行回复.
我可以从头开始写东西,但肯定有人已经这样做了吗?
这有很多部分:
当然至少(1)和(4)在哪里有图书馆支持?
Col*_*son 10
这是一些适用于 Django 1.11+ 的基本中间件代码。它只处理一个范围,但这就是我个人所需要的。
import os
from django.utils.deprecation import MiddlewareMixin
class RangesMiddleware(MiddlewareMixin):
def process_response(self, request, response):
if response.status_code != 200 or not hasattr(response, 'file_to_stream'):
return response
http_range = request.META.get('HTTP_RANGE')
if not (http_range and http_range.startswith('bytes=') and http_range.count('-') == 1):
return response
if_range = request.META.get('HTTP_IF_RANGE')
if if_range and if_range != response.get('Last-Modified') and if_range != response.get('ETag'):
return response
f = response.file_to_stream
statobj = os.fstat(f.fileno())
start, end = http_range.split('=')[1].split('-')
if not start: # requesting the last N bytes
start = max(0, statobj.st_size - int(end))
end = ''
start, end = int(start or 0), int(end or statobj.st_size - 1)
assert 0 <= start < statobj.st_size, (start, statobj.st_size)
end = min(end, statobj.st_size - 1)
f.seek(start)
old_read = f.read
f.read = lambda n: old_read(min(n, end + 1 - f.tell()))
response.status_code = 206
response['Content-Length'] = end + 1 - start
response['Content-Range'] = 'bytes %d-%d/%d' % (start, end, statobj.st_size)
return response
Run Code Online (Sandbox Code Playgroud)
settings.py
像这样安装它:
MIDDLEWARE_CLASSES = [
'path.to.RangesMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
]
Run Code Online (Sandbox Code Playgroud)
这是两个相关的功能请求(一个是开放的,另一个是第一个的副本):
这两个问题都基于Google Group的讨论.
由于架构问题,机票处于"挂起"状态,因为对于这是否真的是Django应该支持的内容尚未达成共识.主要是因为Web服务器能够进行字节服务.
如果您仍然对实现感兴趣,则会发送一个尚未审核的补丁,它实现了一个特殊的RangedFileReader
类,用于使用块返回响应,对头进行StreamingHttpResponse
解析和健全性检查HTTP_RANGE
:
您可以尝试使用fork或将解决方案作为您自己的基础.
仅供参考,有一个又一个尝试制作这里 -这还没有结束,但可以审查有用.
要解析Range
标题,请参阅:
werkzeug
的 parse_range_header()
parse_range_header()
从上面提到的公关httpheader
的parse_range_header()
(另请参阅使用HTTP范围请求) 归档时间: |
|
查看次数: |
4579 次 |
最近记录: |