Added --cors argument to enable CORS

Closes #75
This commit is contained in:
Simon Willison 2017-11-13 10:17:42 -08:00
commit 97c4bf4271
3 changed files with 14 additions and 8 deletions

View file

@ -48,7 +48,8 @@ class BaseView(HTTPMethodView):
def options(self, request, *args, **kwargs): def options(self, request, *args, **kwargs):
r = response.text('ok') r = response.text('ok')
r.headers['Access-Control-Allow-Origin'] = '*' if self.ds.cors:
r.headers['Access-Control-Allow-Origin'] = '*'
return r return r
def redirect(self, request, path): def redirect(self, request, path):
@ -58,7 +59,8 @@ class BaseView(HTTPMethodView):
) )
r = response.redirect(path) r = response.redirect(path)
r.headers['Link'] = '<{}>; rel=preload'.format(path) r.headers['Link'] = '<{}>; rel=preload'.format(path)
r.headers['Access-Control-Allow-Origin'] = '*' if self.ds.cors:
r.headers['Access-Control-Allow-Origin'] = '*'
return r return r
async def pks_for_table(self, name, table): async def pks_for_table(self, name, table):
@ -174,15 +176,16 @@ class BaseView(HTTPMethodView):
dict(zip(columns, row)) dict(zip(columns, row))
for row in rows for row in rows
] ]
headers = {}
if self.ds.cors:
headers['Access-Control-Allow-Origin'] = '*'
r = response.HTTPResponse( r = response.HTTPResponse(
json.dumps( json.dumps(
data, cls=CustomJSONEncoder data, cls=CustomJSONEncoder
), ),
status=status_code, status=status_code,
content_type='application/json', content_type='application/json',
headers={ headers=headers,
'Access-Control-Allow-Origin': '*'
}
) )
else: else:
context = {**data, **dict( context = {**data, **dict(
@ -473,7 +476,7 @@ class RowView(BaseView):
class Datasette: class Datasette:
def __init__(self, files, num_threads=3, cache_headers=True, page_size=50, inspect_data=None, metadata=None): def __init__(self, files, num_threads=3, cache_headers=True, page_size=50, cors=False, inspect_data=None, metadata=None):
self.files = files self.files = files
self.num_threads = num_threads self.num_threads = num_threads
self.executor = futures.ThreadPoolExecutor( self.executor = futures.ThreadPoolExecutor(
@ -481,6 +484,7 @@ class Datasette:
) )
self.cache_headers = cache_headers self.cache_headers = cache_headers
self.page_size = page_size self.page_size = page_size
self.cors = cors
self._inspect = inspect_data self._inspect = inspect_data
self.metadata = metadata self.metadata = metadata

View file

@ -87,9 +87,10 @@ def package(files, tag, metadata):
@click.option('-p', '--port', default=8001) @click.option('-p', '--port', default=8001)
@click.option('--debug', is_flag=True) @click.option('--debug', is_flag=True)
@click.option('--reload', is_flag=True) @click.option('--reload', is_flag=True)
@click.option('--cors', is_flag=True)
@click.option('--inspect-file') @click.option('--inspect-file')
@click.option('-m', '--metadata', type=click.File(mode='r')) @click.option('-m', '--metadata', type=click.File(mode='r'))
def serve(files, host, port, debug, reload, inspect_file, metadata): def serve(files, host, port, debug, reload, cors, inspect_file, metadata):
"""Serve up specified database files with a web UI""" """Serve up specified database files with a web UI"""
if reload: if reload:
import hupper import hupper
@ -107,6 +108,7 @@ def serve(files, host, port, debug, reload, inspect_file, metadata):
ds = Datasette( ds = Datasette(
files, files,
cache_headers=not debug and not reload, cache_headers=not debug and not reload,
cors=cors,
inspect_data=inspect_data, inspect_data=inspect_data,
metadata=metadata_data, metadata=metadata_data,
) )

View file

@ -143,7 +143,7 @@ WORKDIR /app
RUN pip install https://static.simonwillison.net/static/2017/datasette-0.6-py3-none-any.whl RUN pip install https://static.simonwillison.net/static/2017/datasette-0.6-py3-none-any.whl
RUN datasette build {} --inspect-file inspect-data.json RUN datasette build {} --inspect-file inspect-data.json
EXPOSE 8001 EXPOSE 8001
CMD ["datasette", "serve", {}, "--port", "8001", "--inspect-file", "inspect-data.json"{}]'''.format( CMD ["datasette", "serve", {}, "--port", "8001", "--cors", "--inspect-file", "inspect-data.json"{}]'''.format(
' '.join(files), ' '.join(files),
'"' + '", "'.join(files) + '"', '"' + '", "'.join(files) + '"',
metadata_file and ', "--metadata", "{}"'.format(metadata_file) or '', metadata_file and ', "--metadata", "{}"'.format(metadata_file) or '',