2013-08-19 4 views
2

Я пытаюсь настроить аутентификацию, аналогичную настройке 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 диалоговых окон "

+0

Это не очень понятно, что посмотреть проводку данных для входа. В коде я вижу 'url:"/",' он выглядит неправильно. – twil

+0

хорошо. Я знаю, что это неправильно. но я ограничил метод main_page в views.py «index.html» в URL-адресах.py, поэтому я не знаю, как я могу вызвать ajax_login из всех шаблонов, которые наследуют base.html. Я застрял. Я новичок и не в состоянии продумать. –

+0

Я не знал, как работать с ajax или django (обучение). Теперь я изменил свой запрос на отправку ajax, фактически включив csrftoken, правильный url с resolvers в urls.py и немного изменил представление. И он также дает ответ 200. Но, как я сказал ранее, я хочу, чтобы страница заменила «Логин» фактическим именем пользователя. Я возвращаю ответ как «return render_to_response ('index.html', {'username': user}, context_instance = RequestContext (запрос))", но я получаю окно предупреждения с сообщением «undefined» и флажок «Предотвратить эту страницу из диалоговых окон creatng ". Вы можете мне помочь? –

ответ

0

Итак, похоже, что ваша текущая проблема заключается в следующем: alert (json.server_response);. Возможно, вы захотите изучить свой параметр $.ajaxdataType на json.

To quote the docs:

тип данных, которые вы ожидаете от сервера. Если ни один не указан, jQuery попытается вывести его на основе типа ответа MIME (тип XML MIME даст XML, в 1.4 JSON будет создан объект JavaScript, в 1.4 скрипт выполнит скрипт, и все остальное будет возвращается как строка). Доступные типы (и результат, переданный в качестве первого аргумента для вашего обратного вызова успеха): ...

«html»: возвращает HTML как обычный текст; включенные теги скриптов оцениваются при вставке в DOM.

«json»: оценивает ответ как JSON и возвращает объект JavaScript. Данные JSON обрабатываются строгим образом; любой отклоненный JSON отклоняется и возникает ошибка синтаксического анализа. Начиная с jQuery 1.9, пустой ответ также отклоняется; сервер должен вернуть ответ null или {}. (См json.org для получения дополнительной информации о правильном форматировании JSON.)

1

Подход, который я использую, чтобы иметь Tastypie апи слой а и требует аутентификации для API. Если вызов API не выполняется из-за проверки подлинности, клиент может запросить пользователя войти в систему через метод входа ajax.

Вы можете войти пользователь через AJAX с помощью этого gist