【问题标题】:Why do I have duplicate views in my Django rest framework urls.py?为什么我的 Django REST 框架 urls.py 中有重复的视图?
【发布时间】:2022-01-26 17:31:50
【问题描述】:

我试图弄清楚这些端点在 django rest 框架中是如何工作的。

urls.py
urlpatterns = [
    path('api-auth', include('rest_framework.urls', namespace='rest_framework')),
    path('login', django_views.LoginView.as_view(template_name='rest_framework/login.html'), name='login'),
    path('logout', django_views.LogoutView.as_view(), name='logout'),
    path('register', views.UserCreate.as_view()),
    path('get_jwt_token', obtain_jwt_token),
    path('eos_verify_jwt_token', views.EOSVerifyJSONWebToken.as_view()),
]

我得到以下模式:

Using the URLconf defined in ugh_studios_webservices.urls, Django tried these URL patterns, in this order:

    api/ api-auth login/ [name='login']
    api/ api-auth logout/ [name='logout']
    api/ login [name='login']
    api/ logout [name='logout']
    api/ register
    api/ get_jwt_token
    api/ eos_verify_jwt_token
    admin/

The current path, api/api-auth, didn’t match any of these.

为什么有两个登录端点?

我想要做的是有以下端点:

  1. 登录端点
  2. 注销端点
  3. 用户注册端点
  4. JWT 令牌请求 + 验证端点 - 这似乎有效
  5. 自定义验证用户登录(用户名 + 密码)端点(需要自定义响应以与单独的应用程序集成,它需要特定的响应正文)
  6. 需要在可浏览的 API https://www.django-rest-framework.org/topics/browsable-api/ 中查看 - 为什么除了“注册”url 之外我的所有 url 都无法查看?
  7. 需要能够同时处理 HTTP POST 请求(用于验证/登录)以及 html 模板/视图

我也不想创建重复的代码,rest_framework 似乎带有一些用于登录和注销的默认视图。我在堆栈溢出中看到的所有信息都建议创建新的视图类……等等。但是,如果其他框架给了我一些我根本没有正确设置的默认值,我为什么要这样做呢?在我看来,其余框架已经拥有我需要的一切,但我没有正确设置 urls.py。

编辑:

在将我的 url 模式更改为此之后,我似乎得到了我想要的:

urlpatterns = [
    path('', include('rest_framework.urls', namespace='rest_framework')),
    path('register', views.UserCreate.as_view()),
    path('get_jwt_token', obtain_jwt_token),
    path('eos_verify_jwt_token', views.EOSVerifyJSONWebToken.as_view()),
]

但是,我仍然需要弄清楚如何让登录名指向正确的 url。登录后似乎重定向到 /accounts/profile。不过,我没有看到默认的 html 模板,所以也许这不存在?

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    不按你的问题回答 - 这是我的解释。

    据我所知,有 3 个登录 url -

    1. 当我们访问localhost:8000/admin 进入您的管理面板时,它会将我们带到http://localhost:8000/admin/login/?next=/admin/

    2. 当我们安装了rest框架并在我们的project.url文件中包含了rest框架url,比如path('api-auth/', include('rest_framework.urls')),当我们检查rest框架包时,它有一个urls.py文件并包含一个登录url - @987654325 @ 而这个 LoginView 来自 - django/contrib/auth/views

    现在,当您检查这个类 (LoginView) 时,它有一些代码 -

    def get_success_url(self):
        url = self.get_redirect_url()
        return url or resolve_url(settings.LOGIN_REDIRECT_URL)
    

    login_redirect_url 默认值为'/accounts/profile/',请查看this。所以你被重定向到那里,你可以更改设置中的值。

    现在我们可以使用localhost:8000/api-auth/login/(rest 框架登录)之类的 url 直接登录到我们的 api 端点,但是当我们尝试通过前端客户端登录时,例如使用基于令牌的身份验证的 react 应用程序,我们会收到带有此 url 的 CSRF 错误.

    1. 现在要使用令牌身份验证系统登录,我们需要 rest-auth。 (这会生成一个令牌)。我们再次必须在我们的 project.urls 中包含 path('rest-auth/', include('rest-auth.urls')),并拥有 url rest_auth/login。当您检查登录类的序列化程序时,它会使用 allauth。所以我们也必须得到allauth。 Allauth 使我们能够通过用户名或电子邮件或两者来管理登录并做更多事情。

    【讨论】:

      猜你喜欢
      • 2020-03-18
      • 2020-07-11
      • 2018-10-25
      • 1970-01-01
      • 2021-07-31
      • 2014-06-17
      • 2021-08-07
      • 2020-08-08
      • 2021-06-07
      相关资源
      最近更新 更多