繁体   English   中英

django rest 框架——如果身份验证失败,重定向到下一个参数登录

[英]django rest framework — redirect to login with next parameter if authentication fails

当用户在没有正确身份验证的情况下访问页面时,如何使用 Django Rest Framework (v2.3.8) APIView重定向到设置了next url 参数的登录页面?

我完全确定马特现在已经意识到如何做到这一点,但是对于任何新检查这个问题的人,您可以使用与用于任何其他 django 视图相同的方法。 注意:此答案使用 django 1.11 url,对于 django 2+ url,您应该检查 django文档

  1. 使用login_required装饰器

    # urls.py from django.contrib.auth.decorators import login_required from myapp import views urlpatterns += [ url(r'^my-url/', login_required(views.MyView.as_view()), name='my-name'), ]
  2. 使用LoginRequired混合

    # views.py from django.contrib.auth.mixins import LoginRequiredMixin class MyView(LoginRequiredMixin, APIView): ... # urls.py from myapp import views urlpatterns += [ url(r'^my-url/', views.MyView.as_view(), name='my-name'), ]

更多细节和示例可以在 django 文档中找到。

像那样?

from django.contrib.auth.decorators import login_required
urlpatterns = [
    path('swagger/', login_required(schema_view.with_ui('swagger', cache_timeout=0)), name='schema-swagger-ui'),
]
<form class="form-horizontal" method="POST" action="">
    {% csrf_token %}
    <div class="form-group">
         <div class="col-md-10">
         {{ form.as_p }}
         {% if redirect_field_value %}
         <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}"/>
         {% endif %}
         <button class="btn btn-default" type="submit">{% trans "Sign In" %}</button>
       </div>
   </div>
</form>

要使用 DRF 的内置登录和注销视图/模板,请将rest_framework.urls添加到顶级urls.py文件中,如下所示:

urlpatterns += [
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
]

假设您安装了rest_framework ,这将访问其urls.py文件并添加 rest_framework 命名空间。 如果你深入研究, rest_framework.urls实际上看起来与任何其他urls.py模式非常相似——它只是将rest_framework模板与 Django 的内置登录和注销视图链接起来:

from django.conf.urls import url
from django.contrib.auth import views

template_name = {'template_name': 'rest_framework/login.html'}

urlpatterns = [
    url(r'^login/$', views.login, template_name, name='login'),
    url(r'^logout/$', views.logout, template_name, name='logout'),
]

rest_framework默认模板的工作方式与任何其他登录一样 - 它将带有usernamepassword字段的 POST 请求发送到api-auth/login以验证您的用户数据库(假设您使用的是 Django 的 auth.User 模型)。 您还可以创建自己的登录模板(这将做同样的事情)。 我不会更改 DRF 文件,而是将代码混搭,以​​便我的顶级 urls.py 文件如下所示:

from django.conf.urls import url
from django.contrib.auth import views

template_name = {'template_name': 'custom_login.html'}

urlpatterns = [
    url(r'^api-auth/login/$', views.login, template_name, name='login'),
    url(r'^api-auth/logout/$', views.logout, template_name, name='logout'),
]

它仍然使用 Django 的内置登录和注销视图,但使用您自己的模板。 希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM