2015-11-06 90 views
1

的Django V1.7Django的重装和注销

我已经通过this book工作(这是梦幻般的,顺便说一句)后重新登录,我想我拥有了一切工作。所有测试(功能和单元),但由于某种原因,每当我点击logout按钮时,我立即重新登录。我正在使用自定义身份验证后端(本书中给出的),它使用Mozilla Persona ,如书中所述(链接中的章节)。

我看过一些类似的帖子,但没有一个解决方案有帮助。

行为:

  1. 坏凭据登录将不断刷新页面, 这似乎每次查询假面(人物角色错误: Persona says no. Json was: {'status': 'failure', 'reason': 'audience mismatch: domain mismatch'} - 我不小心访问127.0.0.1:8000发现 这而不是localhost:8000 *)。 I 不知道是否每次都查询Persona,或者每次刷新页面后是否保留消息 。
  2. 初始登录似乎正常工作。在关闭和重新加载页面之前,角色弹出窗口会显示并执行这些步骤。

  3. 注销后,页面会刷新,送岗位信息,并重新登录: [06/Nov/2015 21:25:20] "GET /accounts/logout HTTP/1.1" 302 0 [06/Nov/2015 21:25:20] "GET/HTTP/1.1" 200 795 [06/Nov/2015 21:25:21] "POST /accounts/login HTTP/1.1" 200 2 注销被重定向到根页面“/”。

  4. 此行为通过重新启动服务器和Web浏览器而保持不变。如果我停止服务器并关闭浏览器并重新打开(再次输入网址),则该页面已登录。

  5. 此行为在不同的git分支中也存在。我不知道什么时候开始(因为测试仍然通过),但我知道它以前工作。我检查过的每个分支都有相同的问题,这让我觉得这是与缓存或安装有关。

  6. 该行为还会通过移除所有__pycache__,迁移和数据库本身而持续存在。

  7. 该行为通过清除缓存而持续存在。 (编辑/更新:我仍然在写这个,所以它在技术上不是更新......我以前只为'Today'(Firefox)清空了缓存,但没有任何效果;但是,我只清除了所有内容,以及它似乎已经解决了这个问题,我需要做更多的测试,我会更新一次,我敢肯定)

*我知道假面表示使用的IP over localhost,但它。似乎没有什么区别。

这里有一个最小的工作示例:

placeholder.html(注:我把剧本体内

{% load staticfiles %} 

<html> 
<head> 
    <title>placeholder</title> 
</head> 

<body> 
    {% if user.email %} 
     <h3>User: {{ user.email }}</h3> 
     <div class="item"> 
      Logged in as <b>{{ user.email }}</b> 
     </div> 
     <div class="item"> 
      <a class="ui button" id="id_logout" 
       href="{% url 'logout' %}">Log out</a> 
     </div> 
    {% else %} 
     <div class="item"> 
      <a class="ui button" id="id_login" href="#">Sign in</a> 
     </div> 
    {% endif %} 

    <script src="//code.jquery.com/jquery-migrate-1.2.1.min.js"></script> 
    <script src="https://login.persona.org/include.js"></script> 

    <script> 
    var initialize = function(navigator, user, token, urls) { 
     console.log('called initialize'); 
     $('#id_login').on('click', function() { 
     navigator.id.request(); 
     }); 
     navigator.id.watch({ 
     loggedInUser: user, 
     onlogin: function(assertion) { 
      $.post(
      urls.login, 
      {'assertion': assertion, 'csrfmiddlewaretoken': token} 
     ) 
      .done(function() { window.location.reload(); }) 
      .fail(function() { navigator.id.logout(); }); 
     }, 
     onlogout: function() {} 
     }); 
    }; 

    window.MyModule = window.MyModule || { 
     Accounts: { 
     initialize: initialize 
     } 
    }; 
    </script> 

    <script> 
    /*global $, MyModule, navigator */ 
    $(document).ready(function() { 
     var user = "{{ user.email }}" || null; 
     var token = "{{ csrf_token }}"; 
     var urls = { 
      login: "{% url 'persona_login' %}", 
      logout: "TODO", 
     }; 
     MyModule.Accounts.initialize(navigator, user, token, urls); 
    }); 
</script> 

</body> 
</html> 

账户/ views.py(注:我使用Django的本地身份验证。注销,你会在网址中看到。PY)

from django.contrib.auth import authenticate, login 
from django.contrib.auth import logout as auth_logout 
from django.http import HttpResponse 
from django.shortcuts import redirect 

def persona_login(request): 
    user = authenticate(assertion=request.POST['assertion']) 
    if user is not None: 
     login(request, user) 
    return HttpResponse('OK') 


def logout(request, next_page): 
    auth_logout(request) 
    return redirect('/') 

urls.py

from django.conf.urls import patterns, include, url 
#from django.contrib import admin 

urlpatterns = patterns(
    '', 
    # url(r'^admin/', include(admin.site.urls)), 

    url(r'^accounts/', include('apps.accounts.urls')), 

    url(r'^$', 'apps.projects.views.placeholder_view', 
     name='placeholder'), 
) 

账户/ urls.py(注:我用的是本地注销 - 既不方法适用)

from django.conf.urls import patterns, url 
# from django.contrib.auth.views import logout 

urlpatterns = patterns(
    '', 
    url(r'^login$', 'remsci.apps.accounts.views.persona_login', 
     name='persona_login'), 
    # url(r'^logout$', logout, 
    #  {'next_page': '/'}, name='logout'), 
    url(r'^logout$', 'remsci.apps.accounts.views.logout', 
     {'next_page': '/'}, name='logout'), 

authentication.py(注:这是直接从书)

import requests 

from django.conf import settings 
from django.contrib.auth import get_user_model 

User = get_user_model() 

PERSONA_VERIFY_URL = 'https://verifier.login.persona.org/verify' 

import logging 
log = logging.getLogger(__name__) 

class PersonaAuthenticationBackend(object): 

    def authenticate(self, assertion): 
     response = requests.post(
      PERSONA_VERIFY_URL, 
      data={'assertion': assertion, 'audience': settings.DOMAIN} 
     ) 

     if response.ok and response.json()['status'] == 'okay': 
      email = response.json()['email'] 
      try: 
       return User.objects.get(email=email) 
      except User.DoesNotExist: 
       return User.objects.create(email=email) 
     else: 
      log.warning(
       'Persona says no. Json was: {}'.format(response.json())) 

    def get_user(self, email): 
     try: 
      return User.objects.get(email=email) 
     except User.DoesNotExist: 
      return None 

编辑/更新同样,当我写这个。看来这个问题已经解决了here。我有这本书的一个实体副本,但通过使用在线副本回顾并验证所有内容,我只找到指向此代码的链接。我会留下来,以防万一别人遇到这个问题......或者,如果我能找到同样的问题指向相同的解决方案,我会将其删除。

+0

我只想说我碰到同样的错误,非常感谢你的解决方案! –

回答

1

从上面:

It would appear that this problem has already been solved here。我有这本书的一个实体副本,但通过使用在线副本回顾并验证所有内容,我只找到指向此代码的链接。我会留下来,以防万一别人遇到这个问题......或者,如果我能找到同样的问题指向相同的解决方案,我会将其删除。