这个问题部分是由于我在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
答案 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