Python中的变量作用域存在问题

时间:2009-12-02 21:06:34

标签: python django

这个问题部分是由于我在python中缺乏完全理解范围,因此我需要对此进行审核。无论哪种方式,这是一段非常重要的代码,一直在我的Django测试应用程序崩溃。

这是一个片段:

@login_required
def someview(request):
 try:
  usergroup = request.user.groups.all()[0].name
 except:
  HttpResponseRedirect('/accounts/login')

 if 'client' in usergroup:
  stafflist = ProxyUserModel.objects.filter(groups__name='staff')

这里没有脑部手术,问题是我得到如下错误:

 File "/usr/local/django/myapp/views.py", line 18, in someview
   if 'client' in usergroup:

UnboundLocalError: local variable 'usergroup' referenced before assignment

我的问题是,为什么用户组未绑定?如果它是未绑定的,那意味着try语句抛出异常,此时HttpResponseRedirect应该发生,但它永远不会发生。相反,我得到了一个HTTP 500错误,这有点令人困惑。

是的我可以编写更智能的代码,并确保登录的用户肯定有一个与之关联的组。但这不是一个生产应用程序,我只是想了解/学习Python / Django。当没有与组关联的用户登录而不是重定向到登录页面时,为什么会发生上述情况呢?

在这种情况下,我故意以不属于某个群组的用户身份登录。这意味着上面的代码应该抛出一个IndexError异常,如下所示:

>>> somelist = []
>>> print somelist[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

3 个答案:

答案 0 :(得分:10)

HttpResponseRedirect('/accounts/login')

您正在创建它但不返回它。流程继续到下一行,引用usergroup,尽管由于例外它从未被分配过。

except也很麻烦。一般来说,你永远不应该抓住“一切”(except:except Exception:),因为你可能会抛弃许多奇怪的条件,使调试变得非常困难。捕获您认为将在用户未登录时发生的特定异常子类,或者更好的是,使用if测试来查看它们是否已登录。 (这不是一个特例。)

例如。通常在Django:

if not request.user.is_authenticated():
    return HttpResponseRedirect('/accounts/login')

或者如果您担心的是用户不在任何群组中(使[0]失败):

groups= request.user.groups.all()
if len(groups)==0:
    return HttpResponseRedirect('/accounts/login')
usergroup= groups[0].name

答案 1 :(得分:0)

如果您尝试阻止“客户”部分,请尝试移动您。要么是这个,要么在{1}}上面定义。

答案 2 :(得分:0)

如果你有一个try…except套件并希望代码运行iff 没有异常,那么编写代码的习惯如下:

try:
    # code that could fail
except Exception1:
    # handle exception1
except Exception2:
    # handle exception2
else: # the code-that-could-fail didn't
    # here runs the code that depends
    # on the success of the try clause