mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-02 11:30:12 +03:00
Add both OpenAPIRenderer and JSONOpenAPIRenderer
This commit is contained in:
parent
ce1806a39e
commit
5ccdded2a8
|
@ -143,6 +143,13 @@ except ImportError:
|
||||||
coreschema = None
|
coreschema = None
|
||||||
|
|
||||||
|
|
||||||
|
# pyyaml is optional
|
||||||
|
try:
|
||||||
|
import yaml
|
||||||
|
except ImportError:
|
||||||
|
yaml = None
|
||||||
|
|
||||||
|
|
||||||
# django-crispy-forms is optional
|
# django-crispy-forms is optional
|
||||||
try:
|
try:
|
||||||
import crispy_forms
|
import crispy_forms
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
from django.core.management.base import BaseCommand
|
from django.core.management.base import BaseCommand
|
||||||
|
|
||||||
from rest_framework.compat import coreapi
|
from rest_framework.compat import coreapi
|
||||||
from rest_framework.renderers import CoreJSONRenderer, OpenAPIRenderer
|
from rest_framework.renderers import CoreJSONRenderer, OpenAPIRenderer, JSONOpenAPIRenderer
|
||||||
from rest_framework.settings import api_settings
|
from rest_framework.settings import api_settings
|
||||||
|
|
||||||
|
|
||||||
|
@ -15,8 +15,6 @@ class Command(BaseCommand):
|
||||||
# - title
|
# - title
|
||||||
# - url
|
# - url
|
||||||
# - description
|
# - description
|
||||||
# - urlconf
|
|
||||||
# - patterns
|
|
||||||
#
|
#
|
||||||
# Don't particularly want to pass these on the command-line.
|
# Don't particularly want to pass these on the command-line.
|
||||||
# conf file?
|
# conf file?
|
||||||
|
@ -42,5 +40,6 @@ class Command(BaseCommand):
|
||||||
def get_renderer(self, format):
|
def get_renderer(self, format):
|
||||||
return {
|
return {
|
||||||
'corejson': CoreJSONRenderer(),
|
'corejson': CoreJSONRenderer(),
|
||||||
'openapi': OpenAPIRenderer()
|
'openapi': OpenAPIRenderer(),
|
||||||
|
'openapi-json': JSONOpenAPIRenderer()
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,7 @@ from django.utils.html import mark_safe
|
||||||
from rest_framework import VERSION, exceptions, serializers, status
|
from rest_framework import VERSION, exceptions, serializers, status
|
||||||
from rest_framework.compat import (
|
from rest_framework.compat import (
|
||||||
INDENT_SEPARATORS, LONG_SEPARATORS, SHORT_SEPARATORS, coreapi, coreschema,
|
INDENT_SEPARATORS, LONG_SEPARATORS, SHORT_SEPARATORS, coreapi, coreschema,
|
||||||
pygments_css, urlparse
|
pygments_css, urlparse, yaml
|
||||||
)
|
)
|
||||||
from rest_framework.exceptions import ParseError
|
from rest_framework.exceptions import ParseError
|
||||||
from rest_framework.request import is_form_media_type, override_method
|
from rest_framework.request import is_form_media_type, override_method
|
||||||
|
@ -934,7 +934,7 @@ class CoreJSONRenderer(BaseRenderer):
|
||||||
return codec.dump(data, indent=indent)
|
return codec.dump(data, indent=indent)
|
||||||
|
|
||||||
|
|
||||||
class OpenAPIRenderer:
|
class _BaseOpenAPIRenderer:
|
||||||
CLASS_TO_TYPENAME = {
|
CLASS_TO_TYPENAME = {
|
||||||
coreschema.Object: 'object',
|
coreschema.Object: 'object',
|
||||||
coreschema.Array: 'array',
|
coreschema.Array: 'array',
|
||||||
|
@ -944,9 +944,6 @@ class OpenAPIRenderer:
|
||||||
coreschema.Boolean: 'boolean',
|
coreschema.Boolean: 'boolean',
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
assert coreapi, 'Using OpenAPIRenderer, but `coreapi` is not installed.'
|
|
||||||
|
|
||||||
def get_schema(self, instance):
|
def get_schema(self, instance):
|
||||||
schema = {}
|
schema = {}
|
||||||
if instance.__class__ in self.CLASS_TO_TYPENAME:
|
if instance.__class__ in self.CLASS_TO_TYPENAME:
|
||||||
|
@ -1011,8 +1008,8 @@ class OpenAPIRenderer:
|
||||||
|
|
||||||
return paths
|
return paths
|
||||||
|
|
||||||
def render(self, data, media_type=None, renderer_context=None):
|
def get_structure(self, data):
|
||||||
return json.dumps({
|
return {
|
||||||
'openapi': '3.0.0',
|
'openapi': '3.0.0',
|
||||||
'info': {
|
'info': {
|
||||||
'version': '',
|
'version': '',
|
||||||
|
@ -1023,4 +1020,31 @@ class OpenAPIRenderer:
|
||||||
'url': data.url
|
'url': data.url
|
||||||
}],
|
}],
|
||||||
'paths': self.get_paths(data)
|
'paths': self.get_paths(data)
|
||||||
}, indent=4)
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class OpenAPIRenderer(_BaseOpenAPIRenderer):
|
||||||
|
media_type = 'application/vnd.oai.openapi'
|
||||||
|
charset = None
|
||||||
|
format = 'openapi'
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
assert coreapi, 'Using OpenAPIRenderer, but `coreapi` is not installed.'
|
||||||
|
assert yaml, 'Using OpenAPIRenderer, but `pyyaml` is not installed.'
|
||||||
|
|
||||||
|
def render(self, data, media_type=None, renderer_context=None):
|
||||||
|
structure = self.get_structure(data)
|
||||||
|
return yaml.dumps(structure, default_flow_style=False)
|
||||||
|
|
||||||
|
|
||||||
|
class JSONOpenAPIRenderer(_BaseOpenAPIRenderer):
|
||||||
|
media_type = 'application/vnd.oai.openapi+json'
|
||||||
|
charset = None
|
||||||
|
format = 'openapi-json'
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
assert coreapi, 'Using JSONOpenAPIRenderer, but `coreapi` is not installed.'
|
||||||
|
|
||||||
|
def render(self, data, media_type=None, renderer_context=None):
|
||||||
|
structure = self.get_structure(data)
|
||||||
|
return json.dumps(structure, indent=4)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user