認証を行うために Django-rest-auth を使用しています。クライアント側では、次のようにログインしているユーザーのユーザー詳細を取得できます。
$scope.getUser = function(){
$http.get("https://localhost:8000/rest-auth/user/").then(function(response){
$scope.userData = response.data;
$scope.username = $scope.userData.username;
console.log(response.data);
});
}
ただし、サーバー側のビューでは、リクエストからユーザーの詳細が得られません。私のviews.pyは次のようになります:
#view to call a stored proc that returns an exercise list for a particular user
def get_exercise_state_by_user_id(request):
print(request.user) # this gives me AnonymousUser
print(request.user.id) # this gives me None
results = Exercise_state_ui_model.fetch_exercises(request.user.id, -1)
serializer = ExerciseStateSerializer(results, many=True)
return JSONResponse(serializer.data)
「リクエスト」はユーザー関連の情報を提供しないため、次の行は何もしません。
results = Exercise_state_ui_model.fetch_exercises(request.user.id, -1)
何が問題なのですか?リクエストにユーザー関連情報が含まれていないのはなぜですか? 回避策は何ですか?
私のsettings.pyには次のものがあります:
# Application definition
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.sites',
'rest_framework',
#following was added to allow cross domain requests
'corsheaders',
#following were added for ssl thing
'djangosecure',
'sslserver',
#following were added for authentication
'rest_framework.authtoken',
'rest_auth',
'allauth',
'allauth.account',
'rest_auth.registration',
'demo',
)
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
'corsheaders.middleware.CorsMiddleware',
'djangosecure.middleware.SecurityMiddleware',
'django.middleware.common.CommonMiddleware',
)
REST_SESSION_LOGIN = True
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
SITE_ID = 1
ACCOUNT_EMAIL_REQUIRED = False
ACCOUNT_AUTHENTICATION_METHOD = 'username'
ACCOUNT_EMAIL_VERIFICATION = 'optional'
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
'rest_framework.authentication.SessionAuthentication'
),
}
更新私の loginCtrl は次のようになります。
//Login controller
.controller('loginCtrl', function($scope, $location, $state, djangoAuth, $ionicHistory){
$scope.model = {'username':'','password':''};
$scope.complete = false;
$scope.login = function(formData){
$scope.errors = [];
djangoAuth.login($scope.model.username, $scope.model.password)
.then(function(data){
// success case
console.log("Logged in");
//To disable back state
$ionicHistory.nextViewOptions({
disableBack: true
});
//On successful login goto start page
$state.go('start');
},function(data){
// error case
$scope.errors = data;
});
}
})