Django命名空间污染?

时间:2011-01-06 21:22:18

标签: python django django-models fedora

我对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',
)

如果相关,请在Fedora上运行Django 1.2.3。

正如我所说,此前此工作正常。我强烈怀疑django用户模型默认包含在某处。

发生什么事,有人知道吗?一种解决方案是重命名vxd.auth,我怀疑这将解决问题。

更新各种人的调试建议(感谢方式!):  *是的,我试过放下桌子。我甚至可以通过shell操纵我的对象:

$ 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.

Imports(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 个答案:

答案 0 :(得分:2)

您可以修改django来源,并在导入pdb时进入django.contrib.auth.models会话,然后跟踪追溯,直至找到罪魁祸首。在该文件的顶部弹出以下内容。

import pdb; pdb.set_trace()

然后,在出现的提示符下,键入tb。 (或bt,我永远不记得是哪一个。)

答案 1 :(得分:1)

在创建syncdb之前,您是否contrib.auth安装了vxd.auth?看起来您的表结构可能已过时。如果可行,请尝试删除auth_user表,然后重新同步,看看是否能解决问题。

答案 2 :(得分:0)

我通过将vxd.auth重构为vxd.myauth来修复它。 django的任何部分现在都在向auth_user提出请求。命名空间污染并没有给人留下深刻的印象,但没关系。