python - django_rest_framwork 发生 "TypeError: ' 链接对象不支持项目分配”

标签 python django django-rest-framework django-swagger

一个使用 Django、DRF、swagger 的项目。

url 配置如下:

schema_view = get_swagger_view(title='Pastebin API')
urlpatterns = [
    url(r'^$', schema_view),
    url(r'store', include('store.urls')),
    ... # other urls using routers.SimplerRouter
]

和存储/urls.py:

router = routers.SimpleRouter()
router.register(r'', views.StoreViewSet)
urlpatterns = router.urls

和views.StoreViewSet:

class StoreViewSet(BaseObject, GenericViewSet):
    permition_class = ()

    @list_route()
    def detail(self, request):
        return {}

    @list_route(url_path='detail/export')
    def detail_export(self, request):
        return {}

python manage.py runserver后,访问http://127.0.0.1:8000/#,出现TypeError:

File "/usr/local/share/.virtualenvs/dev-finance/lib/python2.7/site-packages/rest_framework_swagger/views.py", line 32, in get
schema = generator.get_schema(request=request)
File "/usr/local/share/.virtualenvs/dev-finance/lib/python2.7/site-packages/rest_framework/schemas.py", line 242, in get_schema
links = self.get_links(request)
File "/usr/local/share/.virtualenvs/dev-finance/lib/python2.7/site-packages/rest_framework/schemas.py", line 276, in get_links
insert_into(links, keys, link)
File "/usr/local/share/.virtualenvs/dev-finance/lib/python2.7/site-packages/rest_framework/schemas.py", line 79, in insert_into
target[keys[-1]] = value
TypeError: 'Link' object does not support item assignment
[ERROR] 2017-05-04 15:25:06,936 log_message(basehttp.py:131) "GET / HTTP/1.1" 500 20384

错误消息显示,Link 对象无法像 dict 那样赋值。

如果我将方法名称从 detail_export 重命名为 details_export,一切都会恢复正常。

rest_framework的@list_route装饰器出现猜测错误 将方法的 url 传输到 Link 对象。

为什么其他方法都可以? 我该如何解决这个问题?

最佳答案

这是 the bug in DRF .可能会在 3.6.4 中修复。现在您可以:

  1. list_route 中删除 url_path:

    class StoreViewSet(BaseObject, GenericViewSet):
        permition_class = ()
    
        @list_route()
        def detail(self, request):
            return {}
    
        @list_route()
        def detail_export(self, request):
            return {}
    
  2. 或者将自定义 SchemaView 与自定义 SchemaGenerator 一起使用:

    # api/schema.py for example
    
    from rest_framework.permissions import AllowAny
    from rest_framework.renderers import CoreJSONRenderer
    from rest_framework.response import Response
    from rest_framework.schemas import SchemaGenerator
    from rest_framework.views import APIView
    from rest_framework_swagger import renderers
    
    
    class CustomSchemaGenerator(SchemaGenerator):
        def get_keys(self, subpath, method, view):
            result = super().get_keys(subpath, method, view)
            # here you can fix your path
            if result == ['store', 'detail', 'detail_export']:  
                return ['store', 'detail_export'] 
            return result
    
    
    class SwaggerSchemaView(APIView):
        _ignore_model_permissions = True
        exclude_from_schema = True
        permission_classes = [AllowAny]
        renderer_classes = [
            CoreJSONRenderer,
            renderers.OpenAPIRenderer,
            renderers.SwaggerUIRenderer
        ]
    
        def get(self, request):
            generator = CustomSchemaGenerator(title='API')
            return Response(generator.get_schema(request=request))
    
    # urls.py
    
    from django.contrib.auth.decorators import login_required
    from api.schema import SwaggerSchemaView   
    
    urlpatterns = [
        # ...
        url(r'^swagger-url/', login_required(SwaggerSchemaView.as_view()))
        # ...
    ]
    

关于python - django_rest_framwork 发生 "TypeError: ' 链接对象不支持项目分配”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43778668/

相关文章:

python - 如何使用 python 脚本自动化 ROS 的终端命令

python - 如何将 django-rest-swagger 2.0 与现有 DRF 应用程序集成(初学者)

python - Django 注销 URL 重定向问题

sql - 在 Postgres 中手动对列进行排序的正确方法是什么?

django - REST Get 请求应该返回图像还是图像 URL?

python - 编写Python或TCL VMD脚本

python - 方括号 "[]"在函数/类文档中意味着什么?

python - 筛选小于另一个日期的最大日期

python - Django-Tastypie 中的多部分/表单数据 POST、PUT、PATCH

python - 将 Django 字母顺序更改为自定义顺序