2016-07-21 5 views
3

Ich habe ein Django REST Framework-Projekt und ich versuche, Swagger-Dokumentation zu generieren. In meiner URL-Datei verwende ich jedoch einen Router und das scheint nicht gut mit Swagger zu funktionieren. Ich folgte den Anweisungen in this discussion und hier ist, was ich habe:Kann Django REST Swagger nicht mit Routern arbeiten

Das funktioniert perfekt:

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')), 
] 

Und ich bekomme die erwartete Seite:

expected page

Wenn ich SwaggerUIRenderer zum schema_renderers hinzufügen Liste jedoch funktioniert es nicht mehr:

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

ich diese Seite erhalten:

You do not have permission to perform this action

Was mache ich falsch ??

UPDATE

Wenn ich ?format=swagger hinzufügen, erhalte ich:

/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

Es scheint, als würden Sie den 'Authorization'-Header nicht mit dieser Anfrage senden. –

+0

Aber wie könnte das Hinzufügen von 'SwaggerUIRenderer' dazu führen, dass der Header' Authorization' verloren geht, während die standardmäßige, durchsuchbare API verwendet wird? Ich bin mir nicht sicher, ob ich klar war, der ** NUR ** Unterschied zwischen den beiden Szenarien ist dieser eine Punkt in der Liste der 'Schema_Renderer'. Im ersten Szenario funktioniert alles und ich bekomme keinen 403 Fehler, daher wird der Header 'Authorization' eindeutig gesendet. Wenn ich jedoch den 'SwaggerUIRenderer' hinzufüge, bricht die durchsuchbare API ab und beginnt mit der Ausgabe von 403. Außerdem erscheint mein Benutzername auch in dem fehlerhaften Szenario immer noch in der oberen Leiste, also bin ich eingeloggt. – Ariel

Antwort

0

An diesem Punkt der SwaggerUIRenderer nicht den Standard durchsuchbaren API der Stammansicht (HTML) nicht außer Kraft setzen, so dass Sie Geben Sie den Abfrageparameter format an, um zwischen den Renderern zu wechseln.

Zum Beispiel:

http://localhost:8000/?format=swagger -> Swagger UI-Schnittstelle

http://localhost:8000/?format=openapi -> Swagger/OpenAPI JSON spec

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

Was die 403 klingt wie entweder eine Authentifizierungskonfiguration oder Sie sind nicht angemeldet.

Alt Entfernen Sie stattdessen die Schemaattribute des Routers, und erstellen Sie stattdessen eine separate Ansicht, die das Schema zurückgibt.

+0

Hey, danke für die Antworten. Ich weiß über den 'format'-Parameter, aber die Sache ist, nur durch Hinzufügen des Swagger-Renderers bricht die standardmäßige, durchsuchbare API ab und gibt mir 403. Ich nehme an, Swagger ist nur eine zusätzliche Option und ich sollte weiterhin auf die durchsuchbare API zugreifen können , Recht? Aber ich kann nicht. Mein Benutzername erscheint immer noch in der oberen Leiste, ich habe die Möglichkeit, mich abzumelden, aber ich bekomme den Fehler 403 in der JSON statt der erwarteten Liste der Endpunkte. – Ariel

+0

Wenn ich eine separate Ansicht erstelle, erhalte ich keine Fehler, aber die Endpunkte, die mit dem Router hinzugefügt werden, erscheinen einfach nicht. – Ariel

Verwandte Themen