##// END OF EJS Templates
Added --post-serve explanation into the nbconvert docs.
Added --post-serve explanation into the nbconvert docs.

File last commit:

r13919:f42c8160
r13983:c87ac2f3
Show More
handlers.py
116 lines | 3.8 KiB | text/x-python | PythonLexer
Thomas Kluyver
Serve nbconvert output as zip when it has multiple files
r13919 import io
Thomas Kluyver
Add HTTP handlers for nbconvert
r13827 import os
Thomas Kluyver
Serve nbconvert output as zip when it has multiple files
r13919 import zipfile
Thomas Kluyver
Add HTTP handlers for nbconvert
r13827
from tornado import web
Thomas Kluyver
Move notebook URL fragment regexen into IPython.html.base.handlers
r13916 from ..base.handlers import IPythonHandler, notebook_path_regex
Thomas Kluyver
Add HTTP handlers for nbconvert
r13827 from IPython.nbformat.current import to_notebook_json
from IPython.nbconvert.exporters.export import exporter_map
from IPython.utils import tz
Thomas Kluyver
Serve nbconvert output as zip when it has multiple files
r13919 from IPython.utils.py3compat import cast_bytes
import sys
def find_resource_files(output_files_dir):
files = []
for dirpath, dirnames, filenames in os.walk(output_files_dir):
files.extend([os.path.join(dirpath, f) for f in filenames])
return files
def respond_zip(handler, name, output, resources):
"""Zip up the output and resource files and respond with the zip file.
Returns True if it has served a zip file, False if there are no resource
files, in which case we serve the plain output file.
"""
# Check if we have resource files we need to zip
output_files = resources.get('outputs', None)
if not output_files:
return False
# Headers
zip_filename = os.path.splitext(name)[0] + '.zip'
handler.set_header('Content-Disposition',
'attachment; filename="%s"' % zip_filename)
handler.set_header('Content-Type', 'application/zip')
# Prepare the zip file
buffer = io.BytesIO()
zipf = zipfile.ZipFile(buffer, mode='w', compression=zipfile.ZIP_DEFLATED)
output_filename = os.path.splitext(name)[0] + '.' + resources['output_extension']
zipf.writestr(output_filename, cast_bytes(output, 'utf-8'))
for filename, data in output_files.items():
zipf.writestr(os.path.basename(filename), data)
zipf.close()
handler.finish(buffer.getvalue())
return True
Thomas Kluyver
Add HTTP handlers for nbconvert
r13827
class NbconvertFileHandler(IPythonHandler):
SUPPORTED_METHODS = ('GET',)
@web.authenticated
def get(self, format, path='', name=None):
Thomas Kluyver
Pass config into nbconvert exporters
r13915 exporter = exporter_map[format](config=self.config)
Thomas Kluyver
Add HTTP handlers for nbconvert
r13827
path = path.strip('/')
os_path = self.notebook_manager.get_os_path(name, path)
if not os.path.isfile(os_path):
raise web.HTTPError(404, u'Notebook does not exist: %s' % name)
info = os.stat(os_path)
self.set_header('Last-Modified', tz.utcfromtimestamp(info.st_mtime))
Thomas Kluyver
Add MIME types to nbconvert exporters
r13830
Thomas Kluyver
Serve nbconvert output as zip when it has multiple files
r13919 output, resources = exporter.from_filename(os_path)
if respond_zip(self, name, output, resources):
return
Thomas Kluyver
Add MIME types to nbconvert exporters
r13830 # Force download if requested
Thomas Kluyver
Add menu entries for getting converted views of a notebook
r13829 if self.get_argument('download', 'false').lower() == 'true':
Thomas Kluyver
Serve nbconvert output as zip when it has multiple files
r13919 filename = os.path.splitext(name)[0] + '.' + resources['output_extension']
Thomas Kluyver
Add menu entries for getting converted views of a notebook
r13829 self.set_header('Content-Disposition',
Thomas Kluyver
Serve nbconvert output as zip when it has multiple files
r13919 'attachment; filename="%s"' % filename)
Thomas Kluyver
Add MIME types to nbconvert exporters
r13830 # MIME type
Thomas Kluyver
Condense raw_mimetype and mime_type traitlets into output_mimetype
r13832 if exporter.output_mimetype:
self.set_header('Content-Type',
'%s; charset=utf-8' % exporter.output_mimetype)
Thomas Kluyver
Add MIME types to nbconvert exporters
r13830
Thomas Kluyver
Add HTTP handlers for nbconvert
r13827 self.finish(output)
class NbconvertPostHandler(IPythonHandler):
SUPPORTED_METHODS = ('POST',)
@web.authenticated
def post(self, format):
Thomas Kluyver
Pass config into nbconvert exporters
r13915 exporter = exporter_map[format](config=self.config)
Thomas Kluyver
Add HTTP handlers for nbconvert
r13827
model = self.get_json_body()
nbnode = to_notebook_json(model['content'])
Thomas Kluyver
Serve nbconvert output as zip when it has multiple files
r13919
output, resources = exporter.from_notebook_node(nbnode)
if respond_zip(self, nbnode.metadata.name, output, resources):
return
Thomas Kluyver
Add MIME types to nbconvert exporters
r13830 # MIME type
Thomas Kluyver
Condense raw_mimetype and mime_type traitlets into output_mimetype
r13832 if exporter.output_mimetype:
self.set_header('Content-Type',
Thomas Kluyver
Serve nbconvert output as zip when it has multiple files
r13919 '%s; charset=utf-8' % exporter.output_mimetype)
Thomas Kluyver
Add MIME types to nbconvert exporters
r13830
Thomas Kluyver
Add HTTP handlers for nbconvert
r13827 self.finish(output)
#-----------------------------------------------------------------------------
# URL to handler mappings
#-----------------------------------------------------------------------------
_format_regex = r"(?P<format>\w+)"
Thomas Kluyver
Move notebook URL fragment regexen into IPython.html.base.handlers
r13916
Thomas Kluyver
Add HTTP handlers for nbconvert
r13827
default_handlers = [
Thomas Kluyver
Move notebook URL fragment regexen into IPython.html.base.handlers
r13916 (r"/nbconvert/%s%s" % (_format_regex, notebook_path_regex),
Thomas Kluyver
Add HTTP handlers for nbconvert
r13827 NbconvertFileHandler),
(r"/nbconvert/%s" % _format_regex, NbconvertPostHandler),
]