2011-01-06 2 views
0

У меня вопрос о пространстве имен Django. Во-первых, я реализовал свою собственную систему аутентификации, поэтому у меня могут быть такие функции, как встроенное редактирование сайтов для аутентифицированных пользователей. По-моему, мне просто не нравилась настройка администратора по умолчанию.Загрязнение пространства имен Django?

Следовательно, я сознательно не включил никакие функции промежуточного программного обеспечения аутентификации или администратора.

В любом случае, у меня есть модель под названием User в vxd.auth.models, которую я использую в vxd.auth.control, чтобы прочитать базу данных для моей системы. Когда я запускаю мою проверку подлинности я получаю эту ошибку:

DatabaseError at/
column auth_user.first_name does not exist 
LINE 1: SELECT "auth_user"."id", "auth_user"."username", "auth_user"... 

Ну, конечно, это не моя User модели не реализует первое поле имени. Однако Django делает это.

Это не проблема, пока я не модернизировал Django и получил удар по CSRF middleware issue ...

Соответствующие части settings.py:

TEMPLATE_LOADERS = ('django.template.loaders.filesystem.Loader', 
    'django.template.loaders.app_directories.Loader', 
) 
MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
) 

AUTHENTICATION_BACKENDS = ('') 

TEMPLATE_CONTEXT_PROCESSORS = ("vxd.auth.contexts.Authentication",) 

INSTALLED_APPS = (
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.sites', 
    'reversetag', 
    'markitup', 
    'vxd.auth', 
    'Testbed.authadmin', 
    'Testbed.testapp', 
) 

Если это уместно, работает Django 1.2.3 на Fedora.

Как я уже сказал, это работало отлично раньше. Я под сильным подозрением, что модель пользователя django включена где-то по умолчанию.

Что происходит, никто не знает? Одним из решений является переименование vxd.auth, которое, как я подозреваю, устранит проблему.

Обновления для предложений отладки различных людей (спасибо, кстати!): * Да, я попытался сбросить таблицы. Я могу даже манипулировать своим объектом через оболочку так:

$ python manage.py shell 
>>> from vxd.auth.models import * 
>>> u = User.objects.get(username="admin") 
>>> print u 
User object 
>>> u.blue 
u'baa26f39c47dd222a04aa8123b141e62ef5e0cffa658207b0754f811e6444ab9' 
>>> 

Так что что-то явно прокралось где-то.

Edit: аутентификация процессора контекст:

def Authentication(request): 
    if AuthenticationCheck(sess=request.session, timeofaction=datetime.datetime.now(), ipaddress=request.META['REMOTE_ADDR']) == True: 
     return dict({'username': request.session["username"]}) 
    else: 
     return dict() 

Authentication Проверочный код:

def AuthenticationCheck(sess, timeofaction, ipaddress): 

    try: 
     user = sess.get("username", None) 
     if user is None: 
      return False 
     else: 
      pass 
    except MultiValueDictKeyError: 
     # not a session object 
     # or no such key exists. 
     return False 

    # some computations based on sess variables which are set when login happens 
    # these are non-conflicting keys unless sess["vxd-blue"] is used elsewhere... 

    # Find "User" from DB. 
    print "User is " + user 

    #try: # don't catch so I can see the error 
    usr = User.objects.get(username=user) # this throws the exception shown. 

Импорт (contexts.py):

from datetime import date, datetime, timedelta 
from vennarddjango.auth.control import * 

импорт (control.py):

from django.db import models 
from django.contrib.sessions.models import * 
from django.utils.datastructures import MultiValueDictKeyError 

import hashlib 
import datetime 

from vxd.auth.models import * 
from vxd.auth.openid.store import * 
from vxd.auth.openid.methods import * 
from vxd.utility.datetimefuncs import * 
from vxd.utility.hashwrapper import * 

ответ

0

Я установил его путем рефакторинга vxd.auth до vxd.myauth. Какая бы часть джанго не срабатывала по запросам до auth_user, сейчас нет. Не массово впечатлил загрязнение пространства имен, но неважно.

+0

По-видимому, я должен ждать 2 дня, прежде чем принять это, так что рассмотрим q все еще открытым. –

+0

Извините, я не мог больше помочь - я пробивал источник Django для модулей, которые вы импортировали, и ни один из них, похоже, не импортировал «Пользователь». – girasquid

1

Вы установили syncdb с contrib.auth перед созданием vxd.auth? Похоже, что ваша структура таблицы может быть устаревшей. Если это возможно, попробуйте удалить таблицу auth_user, а затем повторно синхронизировать и посмотреть, устраняет ли это проблему.

+0

Да, я думал, что это может быть проблемой. У меня есть сценарий, который удаляет все таблицы и перезагружает их данными по умолчанию. Глупо, этот код действительно работает. Однако где-то внутри моего проекта что-то пошло не так ... –

+0

Можете ли вы вставить содержимое вашего контекстного процессора 'Authentication'? – girasquid

+0

Да, сделано. Иметь +1. –

2

Вы можете отредактировать исходный код django и перейти к сеансу pdb, когда импортируется django.contrib.auth.models, и следуйте за ним, пока не найдете виновника. В верхней части этого файла введите следующее.

import pdb; pdb.set_trace() 

Затем, в приглашении, которое появляется, типа tb. (Или bt, я никогда не помню, какой).

+0

Я мог бы дать это, спасибо, много. В любом случае, я рефакторизую сейчас, но в какой-то момент я вернусь и уйду. –

Смежные вопросы