【问题标题】:Django namespace pollution?Django 命名空间污染?
【发布时间】:2011-06-04 22:27:34
【问题描述】:

我有一个关于 Django 命名空间的问题。首先,我实现了自己的身份验证系统,因此我可以为经过身份验证的用户提供内联站点编辑等功能。坦率地说,我只是不喜欢默认的管理员设置。

因此,我有意识地没有包含任何身份验证中间件或管理功能。

无论如何,我在vxd.auth.models 中有一个名为User 的模型,我在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 User 模型默认包含在某处。

这是怎么回事,有人知道吗?一种解决方案是重命名 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.

进口(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 *

【问题讨论】:

    标签: python django django-models fedora


    【解决方案1】:

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

    【讨论】:

    • 是的,我认为这可能是个问题。我有一个脚本可以删除所有表并使用默认数据重新加载它们。愚蠢的是,该代码确实有效。但是,在我的项目中的某个地方,出了点问题......
    • 你能粘贴你的Authentication上下文处理器的内容吗?
    • 您可以粘贴您的context_processors.py 的导入语句吗?似乎它可能在某处导入了错误的 User 模型。
    【解决方案2】:

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

    【讨论】:

    • 显然我必须等待 2 天才能接受这个,所以请考虑 q 仍然打开。
    • 抱歉,我帮不上忙 - 我浏览了您正在导入的模块的 Django 源代码,但它们似乎也没有导入 User
    【解决方案3】:

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

    import pdb; pdb.set_trace()
    

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

    【讨论】:

    • 我可能会试一试,非常感谢。无论如何,我现在已经重构了,但我会在某个时候恢复并试一试。
    猜你喜欢
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 2011-05-14
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多