Я пытаюсь настроить аутентификацию, аналогичную настройке StackOverflow, где обычный просмотр никогда не затрагивается, если нет определенных привилегированных действий, требующих проверки подлинности (не беспокоить пользователей до тогда).Ajax Django Login/Authentication without re-direct
Это должно быть, как «Войти», если не вошли в систему или «UserName», если войти в систему.
Соответствующая часть base.html (от fallr.net) (продолженная index.html) выглядит :
<script type="text/javascript">
//<![CDATA[
$(document).ready(function(){
var methods = {
forms : function(){
var login = function(){
var user = $(this).children('form').children('input[type="text"]').val();
var pass = $(this).children('form').children('input[type="password"]').val();
var dataString = '&username=' + $('input[name=username]').val() + '&password=' + $('input[name=password]').val();
if(user.length < 1 || pass.length < 1){
alert('Invalid!\nPlease fill all required forms');
} else {
alert('username: '+user+'\npassword: '+pass);
$.ajax({
type: "POST",
url: "/login",
dataType: "html",
data: {
username : user,
password : pass,
csrfmiddlewaretoken : '{{ csrf_token }}'
},
success: function(json){alert (json.server_response);},
error: function(xhr,errmsg,err) { alert(xhr.status + ": " + xhr.responseText); }
});
$.fallr('hide');
return false;
}
}
$.fallr('show', {
icon : 'secure',
width : '320px',
content : '<h4>Sign in</h4>'
+ '<form>'
+ '<input name="username" placeholder="username" type="text"/'+'>'
+ '<input name="password" placeholder="password" type="password"/'+'>'
+ '</form>',
buttons : {
button1 : {text: 'Submit', onclick: login},
button4 : {text: 'Cancel'}
}
});
}
};
//button trigger
$('a[href^="#fallr-"]').click(function(){
var id = $(this).attr('href').substring(7);
methods[id].apply(this,[this]);
return false;
});
// syntax highlighter
hljs.tabReplace = ' ';
hljs.initHighlightingOnLoad();
});
//]]>
</script>
urls.py выглядит следующим образом:
from django.conf.urls import patterns, include, url
#from triplanner.views import *
# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()
urlpatterns = patterns('',
url(r'^$', main_page),
url(r'^login$',ajax_login),
url(r'^login/$','django.contrib.auth.views.login'),
url(r'^logout/$', logout_page),
# our application page
url(r'^account/',include('tripapp.urls')),
)
Кроме того, '^ Войти/$' является предыдущей реализации для обучения, который я хочу, чтобы заменить Ajax логин.
И мой views.py:
# -*- coding: utf-8 -*-
from django.contrib.auth import logout
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from django.contrib.auth import authenticate, login
#from django.http import HttpResponse
from django.template import RequestContext
#from django.utils import simplejson
def main_page(request):
return render_to_response('index.html', context_instance=RequestContext(request))
def logout_page(request):
"""
Log users out and redirect them to the main page
"""
logout(request)
return HttpResponseRedirect('/')
def ajax_login(request):
"""
This view logs a user in using the POST data.
"""
if request.method == 'POST':
print request.POST['username']
username = request.POST['username']
password = request.POST['password']
print username
print password
user = authenticate(username=username, password=password)
if (not user is None) and (user.is_active):
login(request, user)
response_dict = {}
response_dict.update({'server_response': username})
#return HttpResponse(simplejson.dumps(response_dict),mimetype='applicaion/javascript')
return render_to_response('index.html',{'username' : user}, context_instance=RequestContext(request))
# Set Session Expiry to 0 if user clicks "Remember Me"
#if not request.POST.get('rem', None):
# request.session.set_expiry(0)
#data = username
else:
return render_to_response('index.html', context_instance=RequestContext(request))
Я получаю 403 ошибки вроде "[20/Август/2013 00:29:20] "POST/HTTP/1.1" 403 2294"
UPDATE НОМЕР 1:
с измененным urls.py, views.py и JavaScript я могу получить ответ 200, но это дает окно предупреждения о том, неопределенных и предупреждая меня «Предотвратить эту страницу с creatng диалоговых окон "
Это не очень понятно, что посмотреть проводку данных для входа. В коде я вижу 'url:"/",' он выглядит неправильно. – twil
хорошо. Я знаю, что это неправильно. но я ограничил метод main_page в views.py «index.html» в URL-адресах.py, поэтому я не знаю, как я могу вызвать ajax_login из всех шаблонов, которые наследуют base.html. Я застрял. Я новичок и не в состоянии продумать. –
Я не знал, как работать с ajax или django (обучение). Теперь я изменил свой запрос на отправку ajax, фактически включив csrftoken, правильный url с resolvers в urls.py и немного изменил представление. И он также дает ответ 200. Но, как я сказал ранее, я хочу, чтобы страница заменила «Логин» фактическим именем пользователя. Я возвращаю ответ как «return render_to_response ('index.html', {'username': user}, context_instance = RequestContext (запрос))", но я получаю окно предупреждения с сообщением «undefined» и флажок «Предотвратить эту страницу из диалоговых окон creatng ". Вы можете мне помочь? –