代码之家  ›  专栏  ›  技术社区  ›  Imnotapotato

为什么我不能在Django路由器(使用djangorestframeworksimplejwt)中注册“.as_view()”?

  •  1
  • Imnotapotato  · 技术社区  · 5 年前

    我一直在尝试将djangorestframeworksimplejwt添加到我的webapp中,每当我使用路由器添加视图时(请参阅下面代码中的2个注释路由器),都会遇到一个错误(请参阅回溯)。

    as the documentation says urlpatterns 变量-它工作时没有任何错误。我想知道为什么这在 router.register(..) 为了保持良好的秩序(以及我的OCD),是否可以将其从urlpatterns变量移到路由器。

    from django.urls import path, include
    from rest_framework import routers
    from . import views
    
    from django.conf.urls import url
    from django.contrib import admin
    from rest_framework_simplejwt.views import (
        TokenObtainPairView,
        TokenRefreshView,
    )
    
    app_name = 'myapi'
    
    router = routers.DefaultRouter()
    router.register(r'posts', views.PostViewSet)
    router.register(r'user', views.UserViewSet)
    router.register(r'likes', views.LikesViewSet)
    # router.register(r'token',TokenObtainPairView.as_view())
    # router.register(r'token/refresh',jwt_views.TokenRefreshView.as_view())
    
    urlpatterns = [
        path('', include(router.urls)), 
        path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
        path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
        path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
    ]
    

    回溯:

    Exception in thread django-main-thread:
    Traceback (most recent call last):
      File "/home/test/anaconda3/envs/ppproject/lib/python3.9/threading.py", line 954, in _bootstrap_inner
        self.run()
      File "/home/test/anaconda3/envs/ppproject/lib/python3.9/threading.py", line 892, in run
        self._target(*self._args, **self._kwargs)
      File "/home/test/anaconda3/envs/ppproject/lib/python3.9/site-packages/django/utils/autoreload.py", line 53, in wrapper
        fn(*args, **kwargs)
      File "/home/test/anaconda3/envs/ppproject/lib/python3.9/site-packages/django/core/management/commands/runserver.py", line 118, in inner_run
        self.check(display_num_errors=True)
      File "/home/test/anaconda3/envs/ppproject/lib/python3.9/site-packages/django/core/management/base.py", line 392, in check
        all_issues = checks.run_checks(
      File "/home/test/anaconda3/envs/ppproject/lib/python3.9/site-packages/django/core/checks/registry.py", line 70, in run_checks
        new_errors = check(app_configs=app_configs, databases=databases)
      File "/home/test/anaconda3/envs/ppproject/lib/python3.9/site-packages/django/core/checks/urls.py", line 13, in check_url_config
        return check_resolver(resolver)
      File "/home/test/anaconda3/envs/ppproject/lib/python3.9/site-packages/django/core/checks/urls.py", line 23, in check_resolver
        return check_method()
      File "/home/test/anaconda3/envs/ppproject/lib/python3.9/site-packages/django/urls/resolvers.py", line 408, in check
        for pattern in self.url_patterns:
      File "/home/test/anaconda3/envs/ppproject/lib/python3.9/site-packages/django/utils/functional.py", line 48, in __get__
        res = instance.__dict__[self.name] = self.func(instance)
      File "/home/test/anaconda3/envs/ppproject/lib/python3.9/site-packages/django/urls/resolvers.py", line 589, in url_patterns
        patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
      File "/home/test/anaconda3/envs/ppproject/lib/python3.9/site-packages/django/utils/functional.py", line 48, in __get__
        res = instance.__dict__[self.name] = self.func(instance)
      File "/home/test/anaconda3/envs/ppproject/lib/python3.9/site-packages/django/urls/resolvers.py", line 582, in urlconf_module
        return import_module(self.urlconf_name)
      File "/home/test/anaconda3/envs/ppproject/lib/python3.9/importlib/__init__.py", line 127, in import_module
        return _bootstrap._gcd_import(name[level:], package, level)
      File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
      File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
      File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
      File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
      File "<frozen importlib._bootstrap_external>", line 790, in exec_module
      File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
      File "/home/test/Projects/ppproject/src/ufb/urls.py", line 25, in <module>
        path('api/', include('myapi.urls', namespace='myapi')),
      File "/home/test/anaconda3/envs/ppproject/lib/python3.9/site-packages/django/urls/conf.py", line 34, in include
        urlconf_module = import_module(urlconf_module)
      File "/home/test/anaconda3/envs/ppproject/lib/python3.9/importlib/__init__.py", line 127, in import_module
        return _bootstrap._gcd_import(name[level:], package, level)
      File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
      File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
      File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
      File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
      File "<frozen importlib._bootstrap_external>", line 790, in exec_module
      File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
      File "/home/test/Projects/ppproject/src/myapi/urls.py", line 18, in <module>
        router.register(r'token',TokenObtainPairView.as_view())
      File "/home/test/anaconda3/envs/ppproject/lib/python3.9/site-packages/rest_framework/routers.py", line 54, in register
        basename = self.get_default_basename(viewset)
      File "/home/test/anaconda3/envs/ppproject/lib/python3.9/site-packages/rest_framework/routers.py", line 137, in get_default_basename
        assert queryset is not None, '`basename` argument not specified, and could ' \
    AssertionError: `basename` argument not specified, and could not automatically determine the name from the viewset, as it does not have a `.queryset` attribute.
    
    1 回复  |  直到 5 年前
        1
  •  1
  •   Andrew    5 年前

    路由器与 ViewSets

    在Django land,每个url都映射到一个视图 功能 ,这是DRF路由器的工作来转换它 ViewSet GET list() 功能等。

    as_view 是一个DRF函数,它将 APIView 或相关类别 进入之内 django的视图函数 path 一起工作。

    route() helper 你可能会觉得有用。它统一了视图“.url”、视图集和替换的路由 path() . 我发现这是我多年来最大的挫折之一。

    urlpatterns = [
        route('students/', 'student.urls'),
        route('users/', UserViewSet, name='user'),
        route('register/', RegisterView, name='register'),
        ...