Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion react/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,4 @@ class ReactRenderingError(Exception):


class RenderServerError(Exception):
pass
pass
4 changes: 2 additions & 2 deletions react/render.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from .render_server import render_server


def render_component(path, props=None, to_static_markup=False, renderer=render_server, request_headers=None, timeout=None):
def render_component(path, props=None, to_static_markup=False, renderer=render_server, request_headers=None, timeout=None, extra_data: dict=None):
if not os.path.isabs(path):
abs_path = staticfiles.find(path)
if not abs_path:
Expand All @@ -14,4 +14,4 @@ def render_component(path, props=None, to_static_markup=False, renderer=render_s
if not os.path.exists(path):
raise ComponentSourceFileNotFound(path)

return renderer.render(path, props, to_static_markup, request_headers, timeout=timeout)
return renderer.render(path, props, to_static_markup, request_headers, timeout=timeout, extra_data=extra_data)
28 changes: 19 additions & 9 deletions react/render_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,11 @@


class RenderedComponent(object):
def __init__(self, markup, props):
def __init__(self, markup, props, css=None, extra_data: dict={}):
self.markup = markup
self.props = props
self.css = css
self.extra_data = extra_data

def __str__(self):
return self.markup
Expand All @@ -20,7 +22,7 @@ def __unicode__(self):


class RenderServer(object):
def render(self, path, props=None, to_static_markup=False, request_headers=None, timeout=None):
def render(self, path: str, props: dict=None, to_static_markup: bool=False, request_headers=None, timeout=None, extra_data: dict={}):
url = conf.settings.RENDER_URL

if props is not None:
Expand All @@ -34,10 +36,12 @@ def render(self, path, props=None, to_static_markup=False, request_headers=None,
options = {
'path': path,
'serializedProps': serialized_props,
'toStaticMarkup': to_static_markup
'toStaticMarkup': to_static_markup,
'extraData': extra_data
}
serialized_options = json.dumps(options)
options_hash = hashlib.sha1(serialized_options.encode('utf-8')).hexdigest()
options_hash = hashlib.sha1(
serialized_options.encode('utf-8')).hexdigest()

all_request_headers = {'content-type': 'application/json'}

Expand All @@ -58,29 +62,35 @@ def render(self, path, props=None, to_static_markup=False, request_headers=None,
timeout=timeout
)
except requests.ConnectionError:
raise RenderServerError('Could not connect to render server at {}'.format(url))
raise RenderServerError(
'Could not connect to render server at {}'.format(url))

if res.status_code != 200:
raise RenderServerError(
'Unexpected response from render server at {} - {}: {}'.format(url, res.status_code, res.text)
'Unexpected response from render server at {} - {}: {}'.format(
url, res.status_code, res.text)
)

obj = res.json()

markup = obj.get('markup', None)
err = obj.get('error', None)
css = obj.get('css', None)
extra_data = obj.get('extra_data', {})

if err:
if 'message' in err and 'stack' in err:
raise ReactRenderingError(
'Message: {}\n\nStack trace: {}'.format(err['message'], err['stack'])
'Message: {}\n\nStack trace: {}'.format(
err['message'], err['stack'])
)
raise ReactRenderingError(err)

if markup is None:
raise ReactRenderingError('Render server failed to return markup. Returned: {}'.format(obj))
raise ReactRenderingError(
'Render server failed to return markup. Returned: {}'.format(obj))

return RenderedComponent(markup, serialized_props)
return RenderedComponent(markup, serialized_props, css, extra_data)


render_server = RenderServer()