2017-01-20 4 views
6

Ich versuche, die Swagger Einstellungen für SecurityDefinition zu bauen, um das folgende Ergebnis in openapi.json zu erhalten:Django REST Swagger: Wie Sicherheitsbereich in Swagger-Einstellungen verwenden?

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

In meinem settings.py habe ich folgende Prahlerei Einstellungen added:

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

Das Problem ist, dass in der openapi.json, die von Swagger generiert wird, gibt es nicht die security dict und ich habe keine Ahnung, wie es erzeugt wird.

Im Folgenden präsentierte die erzeugte 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": {...} 
} 

Gibt es einen besseren Weg, um dieses Konzept in meinen Swagger Einstellungen zu beschreiben? Oder können Sie mich beschreiben, was ist der Prozess und wie es funktioniert, um die openapi.json Datei zu generieren?

+0

Können Sie den Inhalt der Datei openapi.json so posten, dass er leicht zu debuggen ist. –

+0

Ich habe gerade die Frage aktualisiert! –

+0

Warum haben Sie dict Inside List zur Definition von SECURITY erstellt? Probieren Sie es mit schlichtem Diktat. –

Antwort

3

Im Zweifelsfall den Code überprüfen. Sie können die Definition von OpenAPIRenderer here sehen:

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 

So ein Weg, dies zu tun ist, um eine Unterklasse, zum Beispiel:

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

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

     return data 

Dann Sie diese Renderer Klasse für Ihre Ansicht verwenden können. Ich hoffe es hilft!

+0

Leider funktioniert das nicht, da das Feld SECURITY nicht in den Standardwerten definiert ist und wir daher nicht swagger_settings.SECURITY definieren können. Ich denke, dass dies in der Bibliothek aktualisiert werden sollte. Ausgabe auf Github: https://github.com/marcgibbons/django-rest-swagger/issues/628 – physicalattraction

+0

@physicalattraction Ah ich sehe. Denken Sie daran, dass Sie auch mit Django arbeiten und es hat ein sehr flexibles "Einstellungs" -Modul, so dass Sie das obige Problem lösen können: 'from django.conf import settings' ersetzen Sie dann die problematische Zeile durch:' data ["security"] = settings. SWAGGER_SETTINGS ["SICHERHEIT"] ' –

Verwandte Themen