如何使用一个Django REST框架(v2.3.8)APIView
重定向到与当用户访问一个页面没有适当的认证next
url参数组的登录页?
答案 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
默认模板的工作方式与其他任何登录一样 - 它会将username
和password
字段的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。
使用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'),
]
使用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。