Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
207 views
in Technique[技术] by (71.8m points)

Django Swagger starts failing when include is used in django urls

I am using django rest_framework_swagger for my django project, everything was working fine but when I added some URLs with include method Swagger start giving me 500 internal server error.

I am not sure why this error is coming, I have checked but didn't find anything to fix this error.

I am using:

django 1.11.7
rest_framework_swagger 2.1.2
django rest framework 3.7.3

URLs

from django.conf.urls import url, include
from link_one.views import LinkOneViewSet
from link_two.views import LinkTwoViewSet

schema_view = get_swagger_view(title='My Project APIs')

urlpatterns = [

    url(r'^$', schema_view),
    url(r'^foo/(?P<foo_id>w+)/bar/(?P<bar_id>w+)/link1',
        LinkOneViewSet.as_view({'get': 'list'})),
    url(r'^foo/(?P<foo_id>w+)/bar/(?P<bar_id>w+)/link2',
        LinkTwoViewSet.as_view({'get': 'list'})),
    url(r'^foo/(?P<foo_id>w+)/bar/(?P<bar_id>w+)/link3',
        include('link_three.urls'))
]+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

Error

    [25/Jan/2021 14:03:31] ERROR [django.request.exception:135] Internal Server Error: /
Traceback (most recent call last):
  File "C:Usersmyuserconda_envlibsite-packagesdjangocorehandlersexception.py", line 41, in inner
    response = get_response(request)
  File "C:Usersmyuserconda_envlibsite-packagesdjangocorehandlersase.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:Usersmyuserconda_envlibsite-packagesdjangocorehandlersase.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:Usersmyuserconda_envlibsite-packagesdjangoviewsdecoratorscsrf.py", line 58, in wrapped_view
    return view_func(*args, **kwargs)
  File "C:Usersmyuserconda_envlibsite-packagesdjangoviewsgenericase.py", line 68, in view
    return self.dispatch(request, *args, **kwargs)
  File "C:Usersmyuserconda_envlibsite-packages
est_frameworkviews.py", line 489, in dispatch
    response = self.handle_exception(exc)
  File "C:Usersmyuserconda_envlibsite-packages
est_frameworkviews.py", line 449, in handle_exception
    self.raise_uncaught_exception(exc)
  File "C:Usersmyuserconda_envlibsite-packages
est_frameworkviews.py", line 486, in dispatch
    response = handler(request, *args, **kwargs)
  File "C:Usersmyuserconda_envlibsite-packages
est_framework_swaggerviews.py", line 32, in get
    schema = generator.get_schema(request=request)
  File "C:Usersmyuserconda_envlibsite-packages
est_frameworkschemasgenerators.py", line 278, in get_schema
    links = self.get_links(None if public else request)
  File "C:Usersmyuserconda_envlibsite-packages
est_frameworkschemasgenerators.py", line 316, in get_links
    link = view.schema.get_link(path, method, base_url=self.url)
  File "C:Usersmyuserconda_envlibsite-packages
est_frameworkschemasinspectors.py", line 179, in get_link
    fields += self.get_serializer_fields(path, method)
  File "C:Usersmyuserconda_envlibsite-packages
est_frameworkschemasinspectors.py", line 302, in get_serializer_fields
    serializer = view.get_serializer()
  File "C:Usersmyuserconda_envlibsite-packages
est_frameworkgenerics.py", line 112, in get_serializer
    return serializer_class(*args, **kwargs)
TypeError: 'list' object is not callable
question from:https://stackoverflow.com/questions/65881397/django-swagger-starts-failing-when-include-is-used-in-django-urls

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

After searching a lot and debugging, I have found a solution for this.

The solution is, don't use multiple serializer classes for a ViewSet.

In my one viewset I was doing this and this is what creating the problem.

class FooBarViewset(ModelViewSet): 
    serializer_class = [DefaultSerializer, BarSerializer, FooSerializer]

But I did not realize that this will cause the error.

Here is Fix that I am using

class FooBarViewset(ModelViewSet): 
    serializer_class = DefaultSerializer

You can also use the get_serializer method and map serializer class with an action, please check this answer Django rest framework, use different serializers in the same ModelViewSet


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...