我们从Python开源项目中,提取了以下6个代码示例,用于说明如何使用django.views.static.was_modified_since()。
def serve(self, request, path): # the following code is largely borrowed from `django.views.static.serve` # and django-filetransfers: filetransfers.backends.default fullpath = os.path.join(settings.PRIVATE_MEDIA_ROOT, path) if not os.path.exists(fullpath): raise Http404('"{0}" does not exist'.format(fullpath)) # Respect the If-Modified-Since header. statobj = os.stat(fullpath) content_type = mimetypes.guess_type(fullpath)[0] or 'application/octet-stream' if not was_modified_since(request.META.get('HTTP_IF_MODIFIED_SINCE'), statobj[stat.ST_MTIME], statobj[stat.ST_SIZE]): return HttpResponseNotModified(content_type=content_type) response = HttpResponse(open(fullpath, 'rb').read(), content_type=content_type) response["Last-Modified"] = http_date(statobj[stat.ST_MTIME]) # filename = os.path.basename(path) # response['Content-Disposition'] = smart_str(u'attachment; filename={0}'.format(filename)) return response
def serve(self, request, file_obj, **kwargs): fullpath = file_obj.path # the following code is largely borrowed from `django.views.static.serve` # and django-filetransfers: filetransfers.backends.default if not os.path.exists(fullpath): raise Http404('"%s" does not exist' % fullpath) # Respect the If-Modified-Since header. statobj = os.stat(fullpath) content_type_key = 'mimetype' if LTE_DJANGO_1_4 else 'content_type' response_params = {content_type_key: self.get_mimetype(fullpath)} if not was_modified_since(request.META.get('HTTP_IF_MODIFIED_SINCE'), statobj[stat.ST_MTIME], statobj[stat.ST_SIZE]): return HttpResponseNotModified(**response_params) response = HttpResponse(open(fullpath, 'rb').read(), **response_params) response["Last-Modified"] = http_date(statobj[stat.ST_MTIME]) self.default_headers(request=request, response=response, file_obj=file_obj, **kwargs) return response
def get(self, request, name): db_file = get_object_or_404(DBFile.objects.defer('content'), name=name) mtime = time.mktime(db_file.updated_on.timetuple()) modified = was_modified_since( header=self.request.META.get('HTTP_IF_MODIFIED_SINCE'), mtime=mtime, size=db_file.size) if not modified: return HttpResponseNotModified() content_type, encoding = mimetypes.guess_type(db_file.name) content_type = content_type or 'application/octet-stream' response = HttpResponse(db_file.content, content_type=content_type) response['Last-Modified'] = http_date(mtime) response['Content-Length'] = db_file.size if encoding: response['Content-Encoding'] = encoding return response
def staticfiles(request, file): """ Simple view for serving static files directly from STATICFILES_DIRS. Does not allow subdirectories. Does do If-Modified-Since, though. Based on `django.views.static.serve`. """ if '/..\\' in file: raise Http404 if posixpath.normpath(file) != file: raise Http404 for static_file_dir in settings.STATICFILES_DIRS: fullpath = os.path.abspath(os.path.join(static_file_dir, file)) if not fullpath.startswith(static_file_dir): raise Http404 try: st = os.stat(fullpath) except FileNotFoundError: continue break else: raise Http404 if not was_modified_since(request.META.get('HTTP_IF_MODIFIED_SINCE'), st.st_mtime, st.st_size): return HttpResponseNotModified() content_type, encoding = mimetypes.guess_type(fullpath) content_type = content_type or 'application/octet-stream' response = FileResponse(open(fullpath, 'rb'), content_type=content_type) response['Last-Modified'] = http_date(st.st_mtime) if stat.S_ISREG(st.st_mode): response['Content-Length'] = st.st_size if encoding: response['Content-Encoding'] = encoding return response
def serve(private_file): # Support If-Last-Modified mtime = private_file.modified_time.timestamp() size = private_file.size if not was_modified_since(private_file.request.META.get('HTTP_IF_MODIFIED_SINCE'), mtime, size): return HttpResponseNotModified() # As of Django 1.8, FileResponse triggers 'wsgi.file_wrapper' in Django's WSGIHandler. # This uses efficient file streaming, such as sendfile() in uWSGI. # When the WSGI container doesn't provide 'wsgi.file_wrapper', it submits the file in 4KB chunks. response = FileResponse(private_file.open()) response['Content-Type'] = private_file.content_type response['Content-Length'] = size response["Last-Modified"] = http_date(mtime) return response