2017-05-04 52 views
3

使用Django,DRF,招搖的項目。django_rest_framwork發生「類型錯誤:'鏈接'對象不支持項目分配」

網址如下配置:

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/#和類型錯誤發生:

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對象不能像字典一樣分配值。

如果我將方法名稱從detail_export重命名爲details_export,一切都很順利。

當rest_framework的@list_route decorater 將方法的url傳遞給Link對象時發生猜測錯誤。

爲什麼其他方法很好? 我該如何解決這個問題?

+0

這看起來像一個名字碰撞我。這很奇怪,因爲DRF視圖集中的「細節」方法被稱爲「檢索」。它是否可以在沒有大量圖表生成的情況下工作 – Igonato

+0

@Igonato視圖中所有方法的名稱是不同的。它的工作沒有招搖。 –

+0

正如我的想法。如果我是你的話,我只需要帶上另一個名字。此外,在Python中,還有一個約定,在末尾添加「_」以打破名稱衝突,例如, 'print_ =「Hello world!」;打印(print_)' – Igonato

回答

1

這裏是一個黑客:

  1. 打開 您的環境文件夾/ lib目錄/ python3.5 /站點包/ rest_framework/schemas.py
  2. 查找 「insert_into」 功能
  3. 更換這樣的:

    target[keys[-1]] = value 
    

與此:

if type(target) != coreapi.Link: 
    target[keys[-1]] = value 
2

這是the bug in DRF。可能它會在3.6.4中修復。現在,您可以:

  1. 刪除url_pathlist_route

    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())) 
        # ... 
    ] 
    
相關問題