Django命名空间污染?

0 投票
3 回答
1444 浏览
提问于 2025-04-16 09:32

我有一个关于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中间件的问题...

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,我怀疑这样可以解决问题。

关于各种人的调试建议的更新(顺便说一下,谢谢大家!): * 是的,我尝试过删除表。我甚至可以通过命令行像这样操作我的对象:

$ 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 个回答

1

你在创建 vxd.auth 之前,有没有先用 syncdb 命令同步过 contrib.auth 呢?看起来你的表结构可能已经过时了。如果可以的话,试着删除 auth_user 这个表,然后再进行同步,看看这样能不能解决问题。

2

你可以修改一下 django 的源代码,然后在导入 django.contrib.auth.models 时进入一个 pdb 的调试会话,接着跟踪错误信息,直到找到问题所在。在那个文件的最上面加上以下内容。

import pdb; pdb.set_trace()

然后,在出现的提示符下,输入 tb。 (或者 bt,我总是记不住哪个是哪个)。

0

我通过把 vxd.auth 改成 vxd.myauth 来解决这个问题。之前在处理对 auth_user 的请求时,django 有些地方出错了,但现在这些问题都解决了。虽然对命名空间的混乱不是很满意,但也没关系。

撰写回答