python函数运行后none_python – 运行函数时导入的模块变为None

更新:在这篇文章的底部有一些更多的调试信息,它揭示了

python状态下非常棘手的东西.

我有一个模块,可以导入django User对象等.

导入工作正常,代码加载.但是,当您在该模块中调用使用User对象的函数时,它会错误地说User是NoneType.

还有许多其他导入,以及一些模块级全局变量,在调用函数时也是None.

奇怪的是,这只是我们的临时环境(Ubuntu 12.04)中的一个问题.它在本地工作正常,这可能最接近于使用额外的python包进行开发工作.生产也很好.

有没有人遇到过这个,并有任何想法可能导致它?

这是代码:

import urllib

import time

import urlparse

# Django imports

from django.db.models.signals import post_delete

from django.db import models

from django.contrib.auth.models import User

from backends.cache.dualcache import cache

# Piston imports

from managers import TokenManager, ConsumerManager

from signals import consumer_post_delete

KEY_SIZE = 18

SECRET_SIZE = 32

VERIFIER_SIZE = 10

CONSUMER_STATES = (

('pending', 'Pending'),

('accepted', 'Accepted'),

('canceled', 'Canceled'),

('rejected', 'Rejected')

)

def generate_random(length=SECRET_SIZE):

return User.objects.make_random_password(length=length)

class Consumer(models.Model):

name = models.CharField(max_length=255)

description = models.TextField()

key = models.CharField(max_length=KEY_SIZE)

secret = models.CharField(max_length=SECRET_SIZE)

status = models.CharField(max_length=16, choices=CONSUMER_STATES, default='pending')

objects = ConsumerManager()

def __unicode__(self):

return u"Consumer %s with key %s" % (self.name, self.key)

def generate_random_codes(self):

key = User.objects.make_random_password(length=KEY_SIZE)

secret = generate_random(SECRET_SIZE)

while Consumer.objects.filter(key__exact=key, secret__exact=secret).count():

secret = generate_random(SECRET_SIZE)

self.key = key

self.secret = secret

self.save()

这是解决方法,这意味着基本上在函数内再次导入你需要的东西:

import urllib

import time

import urlparse

# Django imports

from django.db.models.signals import post_delete

from django.db import models

from django.contrib.auth.models import User

from backends.cache.dualcache import cache

# Piston imports

from managers import TokenManager, ConsumerManager

from signals import consumer_post_delete

KEY_SIZE = 18

SECRET_SIZE = 32

VERIFIER_SIZE = 10

CONSUMER_STATES = (

('pending', 'Pending'),

('accepted', 'Accepted'),

('canceled', 'Canceled'),

('rejected', 'Rejected')

)

def generate_random(length=SECRET_SIZE):

return User.objects.make_random_password(length=length)

class Consumer(models.Model):

name = models.CharField(max_length=255)

description = models.TextField()

key = models.CharField(max_length=KEY_SIZE)

secret = models.CharField(max_length=SECRET_SIZE)

status = models.CharField(max_length=16, choices=CONSUMER_STATES, default='pending')

objects = ConsumerManager()

def __unicode__(self):

return u"Consumer %s with key %s" % (self.name, self.key)

def generate_random_codes(self):

from piston.models import KEY_SIZE, SECRET_SIZE, Consumer

from django.contrib.auth.models import User

from piston.models import generate_random

key = User.objects.make_random_password(length=KEY_SIZE)

secret = generate_random(SECRET_SIZE)

while Consumer.objects.filter(key__exact=key, secret__exact=secret).count():

secret = generate_random(SECRET_SIZE)

self.key = key

self.secret = secret

self.save()

这是堆栈跟踪.该错误是由该行引起的:

key = User.objects.make_random_password(length=KEY_SIZE)

在generate_random_codes函数中.

Traceback:

File "/sites/tellybug/shared/webserver/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response

111. response = callback(request, *callback_args, **callback_kwargs)

File "/sites/tellybug/shared/webserver/local/lib/python2.7/site-packages/django/contrib/admin/options.py" in wrapper

366. return self.admin_site.admin_view(view)(*args, **kwargs)

File "/sites/tellybug/shared/webserver/local/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapped_view

91. response = view_func(request, *args, **kwargs)

File "/sites/tellybug/shared/webserver/local/lib/python2.7/site-packages/django/views/decorators/cache.py" in _wrapped_view_func

89. response = view_func(request, *args, **kwargs)

File "/sites/tellybug/shared/webserver/local/lib/python2.7/site-packages/django/contrib/admin/sites.py" in inner

196. return view(request, *args, **kwargs)

File "/sites/tellybug/shared/webserver/local/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapper

25. return bound_func(*args, **kwargs)

File "/sites/tellybug/shared/webserver/local/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapped_view

91. response = view_func(request, *args, **kwargs)

File "/sites/tellybug/shared/webserver/local/lib/python2.7/site-packages/django/utils/decorators.py" in bound_func

21. return func(self, *args2, **kwargs2)

File "/sites/tellybug/shared/webserver/local/lib/python2.7/site-packages/django/db/transaction.py" in inner

224. return func(*args, **kwargs)

File "/sites/tellybug/shared/webserver/local/lib/python2.7/site-packages/django/contrib/admin/options.py" in add_view

970. form = ModelForm(initial=initial)

File "/sites/tellybug/shared/webserver/local/lib/python2.7/site-packages/django/forms/models.py" in __init__

234. self.instance = opts.model()

File "/sites/tellybug/shared/webserver/local/lib/python2.7/site-packages/django/db/models/base.py" in __init__

349. val = field.get_default()

File "/sites/tellybug/shared/webserver/local/lib/python2.7/site-packages/django/db/models/fields/related.py" in get_default

983. field_default = super(ForeignKey, self).get_default()

File "/sites/tellybug/shared/webserver/local/lib/python2.7/site-packages/django/db/models/fields/__init__.py" in get_default

379. return self.default()

File "/sites/tellybug/releases/b92109dd526607b2af92ad6b7f494f3f06e31bb2/webserver/tellybug/tbapp/models/tellybugapp.py" in generate_new_consumer

11. consumer.generate_random_codes()

File "/sites/tellybug/releases/b92109dd526607b2af92ad6b7f494f3f06e31bb2/webserver/tellybug/piston/models.py" in generate_random_codes

57. key = User.objects.make_random_password(length=KEY_SIZE)

Exception Type: AttributeError at /admin/tbapp/tellybugapp/add/

Exception Value: 'NoneType' object has no attribute 'objects'

更新:这不仅仅是删除User对象 – 某些东西会破坏函数中的整个上下文.

def generate_random_codes(self):

"""

Used to generate random key/secret pairings. Use this after you've

added the other data in place of save().

c = Consumer()

c.name = "My consumer"

c.description = "An app that makes ponies from the API."

c.user = some_user_object

c.generate_random_codes()

"""

import sys

print "Globals", globals()

print "Name ", __name__

print "Package ", __package__

print "Sys modules", sys.modules['piston.models'].__dict__

key = User.objects.make_random_password(length=KEY_SIZE)

使用这些打印语句,输出为:

Globals {'ColumnFamilyMap': None, 'datetime': None, 'KEY_SIZE': None, 'TokenManager': None, 'ConsistencyLevel': None, 'Nonce': None, 'uuid': None, 'cache': None, 'urllib': None, '__package__': None, 'models': None, 'User': None, .... }

Name None

Package None

Sys modules {'ColumnFamilyMap': , 'datetime': , 'KEY_SIZE': 18, 'NonceType': , 'OAuthToken': , 'TokenManager': , 'ConsistencyLevel': , 'Nonce': , 'uuid': , ...}

请注意,__package__和__name__都是未定义的,我认为这几乎是不可能的,并且虽然模块的sys.modules版本具有正确的__dict__,但globals()的返回值是无意义的.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值