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:
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:
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
Es scheint, als würden Sie den 'Authorization'-Header nicht mit dieser Anfrage senden. –
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