From 9c9d86d7c25d709ad4d5a9a18d9ee545959669c9 Mon Sep 17 00:00:00 2001 From: Sander Steffann Date: Sat, 18 Nov 2017 19:15:03 +0100 Subject: [PATCH 1/4] SchemaJSRenderer renders invalid Javascript Under Py3 the base64.b64encode() method returns a binary object, which gets rendered as `b'...'` in schema.js. This results in the output becoming: var coreJSON = window.atob('b'eyJf...''); which is invalid Javascript. Because base64 only uses ASCII characters it is safe to decode('ascii') it. Under Py2 this will result in a unicode object, which is fine. Under Py3 it results in a string, which is also fine. This solves the problem and results in a working schema.js output. --- rest_framework/renderers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/renderers.py b/rest_framework/renderers.py index 3298294ce2..baf861a7ed 100644 --- a/rest_framework/renderers.py +++ b/rest_framework/renderers.py @@ -852,7 +852,7 @@ class SchemaJSRenderer(BaseRenderer): def render(self, data, accepted_media_type=None, renderer_context=None): codec = coreapi.codecs.CoreJSONCodec() - schema = base64.b64encode(codec.encode(data)) + schema = base64.b64encode(codec.encode(data)).decode('ascii') template = loader.get_template(self.template) context = {'schema': mark_safe(schema)} From e3a7d2236e5422865f2c06f76ced24c2e27ea83a Mon Sep 17 00:00:00 2001 From: Sander Steffann Date: Wed, 22 Nov 2017 13:46:06 +0100 Subject: [PATCH 2/4] Add regression test for #5608 --- tests/test_renderers.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/tests/test_renderers.py b/tests/test_renderers.py index 54b3ce9645..9701cc8bbc 100644 --- a/tests/test_renderers.py +++ b/tests/test_renderers.py @@ -4,6 +4,7 @@ import re from collections import MutableMapping, OrderedDict +import coreapi import pytest from django.conf.urls import include, url from django.core.cache import cache @@ -14,11 +15,10 @@ from django.utils.safestring import SafeText from django.utils.translation import ugettext_lazy as _ -import coreapi from rest_framework import permissions, serializers, status from rest_framework.renderers import ( AdminRenderer, BaseRenderer, BrowsableAPIRenderer, DocumentationRenderer, - HTMLFormRenderer, JSONRenderer, StaticHTMLRenderer + HTMLFormRenderer, JSONRenderer, SchemaJSRenderer, StaticHTMLRenderer ) from rest_framework.request import Request from rest_framework.response import Response @@ -736,3 +736,21 @@ def test_document_with_link_named_data(self): html = renderer.render(document, accepted_media_type="text/html", renderer_context={"request": request}) assert '

Data Endpoint API

' in html + + +class TestSchemaJSRenderer(TestCase): + + def test_schemajs_output(self): + """ + Test output of the SchemaJS renderer as per #5608. Django 2.0 on Py3 prints binary data as b'xyz' in templates, + and the base64 encoding used by SchemaJSRenderer outputs base64 as binary. Test fix. + """ + factory = APIRequestFactory() + request = factory.get('/') + + renderer = SchemaJSRenderer() + + output = renderer.render('data', renderer_context={"request": request}) + + assert "'ImRhdGEi'" in output + assert "'b'ImRhdGEi''" not in output From 6505b7240a02be10d3f253d87e04f987e4a42171 Mon Sep 17 00:00:00 2001 From: Sander Steffann Date: Wed, 22 Nov 2017 13:47:57 +0100 Subject: [PATCH 3/4] Add regression test for #5608 --- tests/test_renderers.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_renderers.py b/tests/test_renderers.py index 9701cc8bbc..d2bd15956e 100644 --- a/tests/test_renderers.py +++ b/tests/test_renderers.py @@ -751,6 +751,5 @@ def test_schemajs_output(self): renderer = SchemaJSRenderer() output = renderer.render('data', renderer_context={"request": request}) - assert "'ImRhdGEi'" in output assert "'b'ImRhdGEi''" not in output From 19ee862c51aa55b5bd2ffbd8e4ace5d2a511de84 Mon Sep 17 00:00:00 2001 From: Sander Steffann Date: Wed, 22 Nov 2017 13:49:53 +0100 Subject: [PATCH 4/4] Apparently the linter on Travis wants the imports in a different order than on my box... --- tests/test_renderers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_renderers.py b/tests/test_renderers.py index d2bd15956e..ba8400c065 100644 --- a/tests/test_renderers.py +++ b/tests/test_renderers.py @@ -4,7 +4,6 @@ import re from collections import MutableMapping, OrderedDict -import coreapi import pytest from django.conf.urls import include, url from django.core.cache import cache @@ -15,6 +14,7 @@ from django.utils.safestring import SafeText from django.utils.translation import ugettext_lazy as _ +import coreapi from rest_framework import permissions, serializers, status from rest_framework.renderers import ( AdminRenderer, BaseRenderer, BrowsableAPIRenderer, DocumentationRenderer, pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy