2017-01-20 8 views
6

मैं आदेश openapi.json में निम्न परिणाम प्राप्त करने के लिए SecurityDefinition के लिए स्वैगर सेटिंग्स का निर्माण करने की कोशिश कर रहा हूँ:Django REST Swagger: 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"] 
    }] 
} 
:

"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 द्वारा उत्पन्न openapi.json में security dict नहीं है और मुझे कोई संकेत नहीं है कि यह कैसे उत्पन्न होता है।

{ 
    "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 प्रस्तुत? या क्या आप मुझे बता सकते हैं कि कौन सी प्रक्रिया है और यह 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

दुर्भाग्यवश यह काम नहीं करता है, क्योंकि फ़ील्ड सुरक्षा डिफ़ॉल्ट रूप से परिभाषित नहीं है, और इसलिए हम swagger_settings.SECURITY को परिभाषित नहीं कर सकते हैं। मुझे लगता है कि यह पुस्तकालय में अद्यतन किया जाना चाहिए हालांकि। गिथब पर समस्या: https://github.com/marcgibbons/django-rest-swagger/issues/628 – physicalattraction

+0

@physicalattraction आह मैं देखता हूं। याद रखें कि आप Django के साथ भी काम कर रहे हैं और इसमें बहुत लचीली 'सेटिंग्स' मॉड्यूल है, इसलिए आप ऊपर दिए गए मुद्दे को हल कर सकते हैं: 'django.conf आयात सेटिंग्स' से, फिर समस्याग्रस्त रेखा को प्रतिस्थापित करें: 'डेटा ["सुरक्षा"] = सेटिंग्स। SWAGGER_SETTINGS [ "सुरक्षा"] ' –

संबंधित मुद्दे