我有一个已经用Django编写的web应用程序,它运行得很好。我想增加一些角度的看法,因为计划是向那个方向移动。我面临的一个问题是,我的一些控制器需要登录,对于django,我们通常使用@login_required装饰器,一切都很好。
但是,由于angular.js调用控制器(对于api),重定向不会发生。我假设我必须以某种方式检查django用户是否直接从角度侧面进行身份验证。关于如何在角度上证实这一点,有什么解释吗?我一直在与此作斗争,并阅读了以下内容:
https://docs.angularjs.org/api/ng/service/$http
prignano/角-js-with-django-bde834dbd61e
http://www.django-rest-framework.org/api-guide/authentication/
基本上,我想确认,通过角,我的用户已登录,如果没有,重定向到登录页面。
编辑
我正在实现一个请求拦截器,如下所示:
但是,在django @login_required中,它返回重定向页面的html。有没有办法获取URL并将用户转发到那里?
发布于 2015-08-25 04:19:46
在定义我的应用程序时,我会这样做:
$httpProvider.interceptors.push('errorInterceptor');
这方面的代码如下:
app.factory('errorInterceptor', ['$q', '$rootScope', '$location',
function ($q, $rootScope, $location) {
return {
request: function (config) {
return config || $q.when(config);
},
requestError: function(request){
return $q.reject(request);
},
response: function (response) {
return response || $q.when(response);
},
responseError: function (response) {
if (response && response.status == 302 && response.data.url) {
window.location = response.data.url;
return;
}
return $q.reject(response);
}
};
}]);基本上,我们不能使用login_required。我们必须创建一个新的装饰师,并提供302状态与一个url。
发布于 2015-03-04 06:15:55
在$routeProvider中添加“解析”如下:
$routeProvider
.when('/', {
templateUrl: '/views/main.html' })
.when('/admin', {
templateUrl: 'views/admin.html',
controller: 'AdminCtrl',
resolve: { loggedin: checkLoggedin } })
.when('/login', {
templateUrl: 'views/login.html',
controller: 'LoginCtrl' })
.otherwise({ redirectTo: '/' }); -发布于 2015-03-09 14:43:54
正如前面的答案所提到的,最好是在需要登录时,Django后端可以发出401响应。现在,它似乎正在发送302,如果您正在发出XHR请求,您仍然可以在浏览器中观察到这一点。正如您所发现的,在角中使用$http拦截器是查找401并将用户发送到登录页面的常见方法。
我采取了一种不同的方法:通过一个名为$user.get()的方法实现一个稍微抽象一点的服务--它向已知的端点发出请求(在我的例子中是/api/users/current),如果它看到401,就拒绝返回的承诺。在您的情况下,您可以实现一个拒绝处理程序,它使用window.location.href将用户发送到您的专用登录页面。
免责声明:我在风暴路径工作,我们花了很多时间思考这个问题:)在我上面的评论中,我指的是我们的风暴路径角SDK --您可以查看这个库,看看我是如何解决这个问题的。
https://stackoverflow.com/questions/28847569
复制相似问题