2016-07-21 49 views
3

我有一個Django REST Framework項目,我試圖生成Swagger文檔。然而,在我的URL文件中,我使用了一個路由器,並且這對於Swagger來說似乎不太合適。我跟着this discussion的指示,這裏就是我的了:無法讓Django REST Swagger與路由器一起工作

這完美的作品:

router = CustomRouter(
    schema_title='My API', 
    schema_renderers=[renderers.CoreJSONRenderer, OpenAPIRenderer], 
    trailing_slash=False 
) 
router.register(r'users', UserViewSet, base_name='user') 
router.register(r'foos', FooFieldViewSet) 
router.register(r'bars', BarViewSet) 

urlpatterns = [ 
    url(r'^', include(router.urls)), 
    url(r'^admin/', include(admin.site.urls)), 
    url(r'^session-auth/', include('rest_framework.urls')), 
    url(r'^rest-auth/', include('rest_auth.urls')), 
] 

我也得到了預期的頁:

expected page

如果我添加SwaggerUIRendererschema_renderers但是,它不再起作用:

router = CustomRouter(
    schema_title='My API', 
    schema_renderers=[renderers.CoreJSONRenderer, OpenAPIRenderer, SwaggerUIRenderer], 
    trailing_slash=False 
) 
# ... 

我得到這個頁面:

You do not have permission to perform this action

我在做什麼錯?

UPDATE

如果我添加?format=swagger,我得到:

/home/vagrant/ve/lib/python3.4/importlib/_bootstrap.py:321: RemovedInDjango110Warning: django.core.context_processors is deprecated in favor of django.template.context_processors. 
    return f(*args, **kwds) 

[22/Jul/2016 09:00:10] "GET /?format=swagger HTTP/1.1" 403 3688 
Internal Server Error:/
Traceback (most recent call last): 
    File "/home/vagrant/ve/lib/python3.4/site-packages/django/core/handlers/base.py", line 174, in get_response 
    response = self.process_exception_by_middleware(e, request) 
    File "/home/vagrant/ve/lib/python3.4/site-packages/django/core/handlers/base.py", line 172, in get_response 
    response = response.render() 
    File "/home/vagrant/ve/lib/python3.4/site-packages/django/template/response.py", line 160, in render 
    self.content = self.rendered_content 
    File "/home/vagrant/ve/lib/python3.4/site-packages/rest_framework/response.py", line 70, in rendered_content 
    ret = renderer.render(self.data, media_type, context) 
    File "/home/vagrant/ve/lib/python3.4/site-packages/rest_framework_swagger/renderers.py", line 18, in render 
    data = json.loads(codec.dump(data)) 
    File "/home/vagrant/ve/lib/python3.4/site-packages/openapi_codec/__init__.py", line 34, in dump 
    data = generate_swagger_object(document) 
    File "/home/vagrant/ve/lib/python3.4/site-packages/openapi_codec/encode.py", line 8, in generate_swagger_object 
    parsed_url = urlparse.urlparse(document.url) 
AttributeError: 'list' object has no attribute 'url' 
[22/Jul/2016 09:00:10] "GET /?format=openapi HTTP/1.1" 500 81912 
+0

看起來你並沒有發送這個請求的Authorization頭。 –

+0

但是如何在使用默認的Browserable API時添加'SwaggerUIRenderer'導致'Authorization'頭部丟失?我不確定我是否清楚,這兩個場景之間的** ONLY **區別在於'schema_renderers'列表中的這一項。在第一種情況下,一切正常,我得不到403錯誤,所以'Authorization'頭顯然正在正確發送。但是,如果我添加了'SwaggerUIRenderer',那麼Browserable API將會中斷並開始給予我403.此外,即使在破損的情況下,我的用戶名仍然出現在頂部欄中,因此我已登錄。 – Ariel

回答

0

在這一點上,SwaggerUIRenderer不會覆蓋根視圖(HTML)的默認瀏覽的API,讓你擁有指定format查詢參數在渲染器之間切換。

例如:

http://localhost:8000/?format=swagger - >揚鞭UI界面

http://localhost:8000/?format=openapi - >揚鞭/ OpenAPI的JSON規格

http://localhost:8000/?format=corejson - > CoreAPI CoreJSON

至於403,聽起來像任驗證配置或者您未登錄。

Alt事實上,刪除路由器的模式屬性,而是創建一個單獨的視圖來返回模式。

+0

嘿,感謝回覆。我知道'format'參數,但事實上,通過添加Swagger渲染器,默認的Browserable API會中斷並給我403.我認爲Swagger只是一個額外的選項,我仍然應該能夠訪問Browserable API , 對?但我不能。我的用戶名仍然出現在頂部欄中,我可以選擇註銷,但是我在json中得到了403錯誤,而不是預期的終結點列表。 – Ariel

+0

如果我創建一個單獨的視圖,我沒有得到任何錯誤,但使用路由器添加的端點根本不顯示。 – Ariel