尝试/除了django,良好做法

时间:2012-08-30 01:47:13

标签: django exception-handling try-catch

这部分代码代表我的网页索引 例如:127.0.0.1:8000 /

def IndexView(request):
    try:
        profile = request.user.get_profile() 
    except User.DoesNotExist:
        return render_to_response('index.html',
                              {'request': request,},
                              context_instance=RequestContext(request))

    return render_to_response('index.html',
                  {'request': request, 'profile' : profile},
                  context_instance=RequestContext(request))  

为什么我在调试时仍然出现此错误?

/的AttributeError 'AnonymousUser'对象没有属性'get_profile'

提前致谢

6 个答案:

答案 0 :(得分:4)

您需要添加此项检查:

from django.shortcuts import render

def index_view(request):

    if request.user.is_authenticated():
        profile = request.user.get_profile()
        return render(request,'index.html',{'profile': profile})
    else:
        return redirect('login/')

或者,您可以使用内置的装饰器,确保仅使用登录用户调用您的视图:

from django.contrib.auth.decorators import login_required
from django.shortcuts import render

@login_required
def index_view(request):

    profile = request.user.get_profile()
    return render(request,'index.html',{'profile': profile})

如果您使用login_required decorator,则需要确保您的LOGIN_URL设置指向处理您网站登录表单的视图。默认情况下,这是/accounts/login/

我将方法名称更改为小写,因为CamelCase通常用于Python中的类。此外,由于渲染相同的模板,因此不需要两个return语句。相反,您可以在index.html模板中执行以下操作:

{% if profile %}
    You have a profile!
{% else %}
    You don't
{% endif %}

有关身份验证的提示和技巧列在文档中的authentication entry

答案 1 :(得分:0)

因为用户当前没有登录。当你调用get_profile时,它会被Django提供的默认用户调用,称为AnonymousUser,它没有get_profile方法,因为它不是真正的用户。它没有抛出我假设的异常,因此你得到一个错误。 登录后尝试相同的事情,它应该没问题。

答案 2 :(得分:0)

您收到此错误,因为此特定用户未登录。

要防止错误,请在视图上使用@login_required装饰器:

from django.contrib.auth.decorators import login_required

@login_required
def IndexView(request):
    ...

或:

def IndexView(request):
    if request.user.is_authenticated(): #check to use if user is logged in
        try:
            profile = request.user.get_profile() 
        except User.DoesNotExist:
            return render_to_response('index.html',
                              {'request': request,},
                              context_instance=RequestContext(request))

        return render_to_response('index.html',
                      {'request': request, 'profile' : profile},
                      context_instance=RequestContext(request))  

答案 3 :(得分:0)

您预计会出现User.DoesNotExist错误,但代码却会抛出AttributeError。这是因为request.user是一个真实的对象 - 一个AnonymousUser对象 - 并且访问它不会导致错误,但AnonymousUser没有配置文件。

使用@login_required装饰器,或者抓住AttributeError,或调整代码,使其实际投掷User.DoesNotExist

答案 4 :(得分:0)

在尝试通过get_profile提取个人资料之前,您需要检查用户是否已通过身份验证。您还可以简化代码:

def IndexView(request):
    profile = request.user.is_authenticated() and request.user.get_profile() 

    return render_to_response('index.html',
                              {'request': request, 'profile': profile},
                              context_instance=RequestContext(request))

你不需要除外,因为User始终在那里。

答案 5 :(得分:-1)

只是为了让你知道,那不是很干的代码。

检查它:

def index_view(request):
    context_data = {'request': request}
    try:
        context_data.update('profile': request.user.get_profile())
    except AttributeError:
        pass

    return render_to_response('index.html', context_data,
         context_instance=RequestContext(request))  

另外,我会仔细检查并确保请求尚未包含在上下文中。您可能没有必要在此处具体说明。

编辑:忘记将context_data传递给render_to_response,示例已更新。