2017-01-20 48 views
6

Próbuję zbudować ustawienia Swagger dla SecurityDefinition aby uzyskać następujący wynik w openapi.json:Django REST Swagger: Jak korzystać z sekcji bezpieczeństwa w ustawieniach 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"] 
}] 

W moim settings.py mam addded następujące ustawienia Swagger:

# 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"] 
    }] 
} 

Problem polega na tym, że w openapi.json wygenerowanym przez Swagger nie ma dyktatu security i nie mam pojęcia, jak jest generowany.

Poniżej przedstawiono wygenerowany 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": {...} 
} 

Czy istnieje lepszy sposób na opisanie tego pojęcia w moich ustawieniach Swagger? Czy możesz mi opisać, który proces i jak działa, aby wygenerować plik openapi.json?

+0

Czy możesz opublikować zawartość pliku openapi.json, aby można było łatwo debugować –

+0

Właśnie zaktualizowałem pytanie! –

+0

Po co skonstruowałeś listę Dict do zdefiniowania BEZPIECZEŃSTWA? Spróbuj z prostym dyktem. –

Odpowiedz

3

W razie wątpliwości sprawdź kod. Można zobaczyć definicję 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 

więc jednym ze sposobów na to jest do podklasy, na przykład:

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

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

     return data 

Następnie można użyć tej klasy renderujący dla widoku. Mam nadzieję, że to pomoże!

+0

Niestety to nie działa, ponieważ pole BEZPIECZEŃSTWO nie jest zdefiniowane w wartościach domyślnych, a zatem nie możemy zdefiniować ustawień przekierowań.SECURITY. Myślę, że powinno to zostać zaktualizowane w bibliotece. Problem na Github: https://github.com/marcgibbons/django-rest-swagger/issues/628 – physicalattraction

+0

@physicalattraction Ah Widzę. Pamiętaj, że pracujesz również z Django i ma bardzo elastyczny moduł 'settings', więc możesz rozwiązać powyższy problem z:' od ustawień importowania django.conf', a następnie zastąpić problemyczną linię: 'data [" security "] = settings. SWAGGER_SETTINGS ["SECURITY"] ' –