2017-01-20 3 views
6

Я пытаюсь построить настройки чванства для SecurityDefinition, чтобы получить следующий результат openapi.json:Django REST Swagger: Как использовать раздел безопасности в настройках Swagger?

"securityDefinitions": { 
    "password": { 
    "type": "oauth2", 
    "tokenUrl": "http://example.com/oauth/token", 
    "flow": "password", 
    "scopes": { 
     "write": "allows modifying resources", 
     "read": "allows reading resources" 
    } 
    } 
}, 
"security": [{ 
    "password": ["read", "write"] 
}] 

В моем settings.py я addded следующих параметров чванства:

# Swagger settings 
SWAGGER_SETTINGS = { 
    "SECURITY_DEFINITIONS": { 
    "password": { 
     "type": "oauth2", 
     "tokenUrl": "http://example.com/oauth/token", 
     "flow": "password", 
     "scopes": { 
      "write": "allows modifying resources", 
      "read": "allows reading resources" 
     } 
    } 
    }, 
    "SECURITY": [{ 
    "password": ["read", "write"] 
    }] 
} 

Проблема в том, что в openapi.json, который сгенерирован Swagger, нет security dict, и я понятия не имею, как он генерируется.

Ниже представлен сгенерированный openapi.json:

{ 
    "info": { 
     "title": "Example Service API", 
     "version": "" 
    }, 
    "host": "http://example.com", 
    "swagger": "2.0", 
    "securityDefinitions": { 
     "password": { 
      "type": "oauth2", 
      "scopes": { 
       "write": "allows modifying resources", 
       "read": "allows reading resources" 
      }, 
      "tokenUrl": "http://example.com/oauth/token", 
      "flow": "password" 
     } 
    }, 
    "paths": {...} 
} 

Есть ли лучший способ описать эту концепцию в моих настройках чванства? Или вы можете описать меня, какой процесс и как он работает, чтобы сгенерировать файл openapi.json?

+0

Можете ли вы опубликовать содержимое файла openapi.json, чтобы он легко отлаживал –

+0

Я только что обновил вопрос! –

+0

Почему у вас встроен внутренний внутренний список для определения БЕЗОПАСНОСТИ? Попробуйте это с простым dict. –

ответ

3

При возникновении сомнений проверьте код. Вы можете увидеть определение OpenAPIRenderer here:

class OpenAPIRenderer(BaseRenderer): 
    media_type = 'application/openapi+json' 
    charset = None 
    format = 'openapi' 

    def render(self, data, accepted_media_type=None, renderer_context=None): 
     if renderer_context['response'].status_code != status.HTTP_200_OK: 
      return JSONRenderer().render(data) 
     extra = self.get_customizations() 

     return OpenAPICodec().encode(data, extra=extra) 

    def get_customizations(self): 
     """ 
     Adds settings, overrides, etc. to the specification. 
     """ 
     data = {} 
     if swagger_settings.SECURITY_DEFINITIONS: 
      data['securityDefinitions'] = swagger_settings.SECURITY_DEFINITIONS 

     return data 

Так один из способов сделать это подкласс, например:

class MyOpenAPIRenderer(OpenAPIRenderer): 
    def get_customizations(self): 
     data = super().get_customizations() 

     # your customizations 
     data["security"] = swagger_settings.SECURITY 

     return data 

Затем вы можете использовать этот класс визуализации для вашего зрения. Надеюсь, поможет!

+0

К сожалению, это не сработает, так как поле SECURITY не определено по умолчанию, поэтому мы не можем определить swagger_settings.SECURITY. Я думаю, что это должно быть обновлено в библиотеке. Проблема в Github: https://github.com/marcgibbons/django-rest-swagger/issues/628 – physicalattraction

+0

@physicalattraction А я вижу. Помните, что вы тоже работаете с Django, и у него очень гибкий модуль 'settings', поэтому вы можете решить вышеупомянутую проблему с помощью:' from django.conf import settings', а затем заменить проблемную строку: 'data [" security "] = settings. SWAGGER_SETTINGS [ "SECURITY"] ' –