2016-07-21 2 views
3

私はDjango RESTフレームワークプロジェクトを持っており、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')), 
] 

そして、私が期待されるページを取得:私はschema_renderersSwaggerUIRendererを追加する場合

expected page

をリストは、それ以上動作しません:

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

しかし、 'SwaggerUIRenderer'を追加すると、デフォルトのBrowserable APIを使用している間に' Authorization'ヘッダが失われることがありますか?私は明確ではないと確信しています** 2つのシナリオ間の違いは 'schema_renderers'のリストにあるこの1項目だけです。最初のシナリオでは、すべてが機能し、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 - 403について> CoreAPI CoreJSON

は、いずれかのように聞こえます認証設定またはログインしていません。

Alt例外的に、ルータのスキーマ属性を削除し、その代わりにスキーマを返す別個のビューを作成します。

+0

応答。私は 'format'パラメータについて知っていますが、スワッガーレンダラーを追加するだけで、デフォルトのBrowserable APIが壊れて、私に403が与えられます。Swaggerは余分なオプションであり、私はBrowserable APIにアクセスできるはずです、 右?しかし、私はできません。私のユーザー名はトップバーに表示されていますが、ログアウトするオプションがありますが、エンドポイントの予想されるリストの代わりにjsonに403エラーが表示されます。 – Ariel

+0

別のビューを作成しても、エラーは発生しませんが、ルータを使用して追加されたエンドポイントは表示されません。 – Ariel

関連する問題