django rest framework - 如果身份验证失败,则使用下一个参数重定向到登录

时间:2015-04-23 19:24:04

标签: python django django-rest-framework

如何使用一个Django REST框架(v2.3.8)APIView重定向到与当用户访问一个页面没有适当的认证next url参数组的登录页?

3 个答案:

答案 0 :(得分:1)

喜欢吗?

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>

答案 1 :(得分:0)

要使用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,以验证您的用户数据库(假设您&# 39;重新使用Django&#39; 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的内置登录和注销视图,但是您自己的模板。希望这有帮助!

答案 2 :(得分:0)

我完全确定Matt到现在已经意识到了如何做到这一点,但是对于任何再次检查这个问题的人来说,您可以使用与其他django视图相同的方法。注意:此答案使用的是django 1.11网址,对于django 2+网址,则应选中django documentation

  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 mixin

    # 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 documentation