2017-01-20 17 views
6

Tôi đang cố gắng để xây dựng các thiết lập Swagger cho SecurityDefinition để có được kết quả sau trong openapi.json:Django REST Swagger: Cách sử dụng phần bảo mật trong cài đặt 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"] 
}] 

Trong settings.py của tôi, tôi đã addded các thiết lập vênh vang sau:

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

Vấn đề là trong openapi.json được tạo ra bởi Swagger không có số security dict và tôi không có đầu mối nó được tạo ra như thế nào.

Dưới đây, trình bày openapi.json tạo:

{ 
    "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": {...} 
} 

Có cách nào tốt hơn để mô tả khái niệm này trong cài đặt Swagger của tôi? Hoặc bạn có thể mô tả tôi là quy trình và cách thức hoạt động của nó để tạo tệp openapi.json không?

+0

Bạn có thể đăng nội dung tệp openapi.json để dễ dàng gỡ lỗi –

+0

Tôi vừa cập nhật câu hỏi! –

+0

Tại sao u xây dựng dict bên trong danh sách để xác định AN NINH? Hãy thử nó với dict đồng bằng. –

Trả lời

3

Khi nghi ngờ, hãy kiểm tra mã. Bạn có thể xem định nghĩa của 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 

Vì vậy, một trong những cách để làm điều này là để phân lớp, ví dụ:

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

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

     return data 

Sau đó, bạn có thể sử dụng lớp renderer này cho tầm nhìn của bạn. Hy vọng nó giúp!

+0

Thật không may điều này không hoạt động, vì trường AN NINH không được xác định mặc định, và do đó chúng tôi không thể xác định swagger_settings.SECURITY. Tôi nghĩ rằng điều này nên được cập nhật trong thư viện mặc dù. Vấn đề về Github: https://github.com/marcgibbons/django-rest-swagger/issues/628 – physicalattraction

+0

@physicalattraction Ah tôi hiểu rồi. Hãy nhớ rằng bạn đang làm việc với Django quá và nó có module 'settings' rất linh hoạt, vì vậy bạn có thể giải quyết vấn đề trên bằng:' from django.conf settings' sau đó thay thế dòng có vấn đề bằng: 'data [" security "] = settings. SWAGGER_SETTINGS ["AN NINH"] ' –

Các vấn đề liên quan