Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings
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
1 change: 1 addition & 0 deletions 1 README.md
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,7 @@ DEBUG = True

settings.configure(
RENDER=not DEBUG,
NO_THROW=not DEBUG,
RENDER_URL='http://127.0.0.1:9009/render',
)
```
Expand Down
17 changes: 16 additions & 1 deletion 17 react/conf.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
class Conf(object):
_render_url = 'http://127.0.0.1:9009/render'
_render = True
_no_throw = False

# Indicates that we should rely on Django's settings as the
# canonical reference and use the above defaults as fallbacks.
Expand Down Expand Up @@ -32,10 +33,24 @@ def RENDER(self):

return self._render

def configure(self, RENDER_URL=None, RENDER=None):
@property
def NO_THROW(self):
if not self._PROXY_DJANGO_SETTINGS:
return self._no_throw

from django.conf import settings

if hasattr(settings, 'REACT'):
return settings.REACT.get('NO_THROW', self._no_throw)

return self._no_throw

def configure(self, RENDER_URL=None, RENDER=None, NO_THROW=None):
if RENDER_URL is not None:
self._render_url = RENDER_URL
if RENDER is not None:
self._render = RENDER
if NO_THROW is not None:
self._no_throw = NO_THROW

settings = Conf()
26 changes: 18 additions & 8 deletions 26 react/render_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,29 +60,39 @@ 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))
if conf.settings.NO_THROW:
return RenderedComponent('', serialized_props, {})
else:
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)
)
if conf.settings.NO_THROW:
return RenderedComponent('', serialized_props, {})
else:
raise RenderServerError(
'Unexpected response from render server at {} - {}: {}'.format(url, res.status_code, res.text)
)

obj = res.json()

markup = obj.pop('markup', None)
err = obj.pop('error', None)
data = obj

if err:
if markup is None:
if conf.settings.NO_THROW:
return RenderedComponent('', serialized_props, {})
else:
raise ReactRenderingError('Render server failed to return markup. Returned: {}'.format(obj))

if err and not conf.settings.NO_THROW:
if 'message' in err and 'stack' in err:
raise ReactRenderingError(
'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))


return RenderedComponent(markup, serialized_props, data)


Expand Down
24 changes: 24 additions & 0 deletions 24 tests/test_rendering.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,30 @@ def test_render_setting_is_respected(self):
self.assertEqual(str(rendered), '')
self.assertEqual(rendered.props, '{"name": "world!"}')

@mock.patch('requests.post')
def test_no_throw_setting_is_respected(self, requests_post_mock):
mock_settings = Conf()
mock_settings.configure(NO_THROW=True)
mock_json = {
'markup': '',
'error': {
'type': 'Error',
'message': 'Error message',
},
}
response_mock = mock.Mock()
response_mock.status_code = 500
response_mock.text = json.dumps(mock_json)
response_mock.json = mock.Mock(return_value=mock_json)
requests_post_mock.return_value = response_mock
with mock.patch('react.conf.settings', mock_settings):
rendered = render_component(
Components.HELLO_WORLD_JSX,
{'name': 'world!'},
to_static_markup=True,
)
self.assertEqual(rendered.markup, '')

@mock.patch('requests.post')
def test_can_pass_additional_request_headers(self, requests_post_mock):
mock_json = {
Expand Down
Morty Proxy This is a proxified and sanitized view of the page, visit original site.