Загрязнение пространства имен Джанго? - PullRequest
0 голосов
/ 07 января 2011

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

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

В любом случае, у меня есть модель под названием 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 и не столкнулся с проблемой промежуточного программного обеспечения CSRF ...

Соответствующие части 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'
>>>

Так что что-то явно подкрадывается куда-то.

Редактировать: процессор контекста аутентификации:

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()

Код проверки подлинности:

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 *

Ответы [ 3 ]

2 голосов
/ 07 января 2011

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

import pdb; pdb.set_trace()

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

1 голос
/ 07 января 2011

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

0 голосов
/ 07 января 2011

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

...