Я использую AngularJS для интерфейсного и Django для бэкэнд веб-приложения, над которым я работаю. Сейчас я работаю над входом в систему пользователей, и у меня возникла странная проблема. Heres соответствующий Угловой код:AngularJS/Django Post Response Data
app.factory('AuthService', ["$http", "$q", "Session", "URL", function($http, $q, Session, URL) {
return {
login: function(credentials) {
var deferred = $q.defer();
$http.post(URL.login, credentials)
.then(function(data, status, headers, config) {
data=data.data; //WHY DOES THIS WORK?
if (data.success == true) {
alert("logged in");
Session.create(credentials.username, data.api_key);
deferred.resolve();
}
else {
deferred.reject("Login failed!");
}
}, function(data, status, headers, config) {
deferred.reject("Login failed!");
});
return deferred.promise
},
А вот соответствующий Джанго вид:
def login_user(request):
'''
Given a username and password, returns the users API key.
'''
if request.method == 'POST':
username = request.POST.get('username',None)
password = request.POST.get('password',None)
user = authenticate(username=username,password=password)
if user is not None:
api_key = ApiKey.objects.get(user=user)
response_data = {}
response_data["api_key"] = str(api_key).split(" ")[0]
response_data["success"] = True
return HttpResponse(json.dumps(response_data), content_type="application/json")
else:
return HttpResponse(json.dumps({"username":username,"success":False}),content_type="application/json")
return HttpResponseBadRequest()
Когда пользователь входит в запросе POST отправляются и обрабатываются выше Джанго коды. Затем ответ подбирается кодом AngularJS выше. Как вы можете видеть, метод then()
в угловом коде принимает обычные четыре параметра: данные, состояние, конфиг и заголовки. Я ожидаю, что данные содержат словарь, выводимый из кода Django, соответствующим образом сериализованный в объект JSON.
Однако происходит то, что единственным параметром метода then(), который не является неопределенным, являются данные, и это содержит ВСЕ; заголовки, данные, код состояния и т. д.
Линия, прокомментированная «ПОЧЕМУ ЭТА РАБОТА», устраняет проблему, обращаясь к данным внутри. Тем не менее, я хочу знать, почему это происходит, и если есть способ избежать этого. Я думаю, что это связано с тем, как Django сериализует ответ, но я не уверен.
Я использую Django 1.6.5.
Я рекомендовал прочитать это https://thinkster.io/django-angularjs-tutorial – mrvol