将单独的函数转换为基于类的函数

时间:2011-06-04 06:24:42

标签: python django

我有几个需要“重定向”过滤器的功能。重定向过滤器就像这样 -

1)如果用户未登录且没有会话数据,则重定向到登录页面。

2)如果用户已登录并已填写页面,则重定向到用户主页。

3)如果用户已登录但尚未填写页面,请留在页面上。

4)如果用户未登录并拥有会话数据,请留在页面上

我已经开始将这些函数转换为基于类的方法,以使其更高效,更少代码(以前我的视图函数非常庞大)。这是我尝试制作基于类的东西的第一次尝试,这是我到目前为止所做的 -

def redirect_filter(request):
    if request.user.is_authenticated():
        user = User.objects.get(email=request.user.username)
        if user.get_profile().getting_started_boolean:
            return redirect('/home/') ## redirect to home if a logged-in user with profile filled out
        else:
            pass  ## otherwise, stay on the current page
    else
        username = request.session.get('username')
        if not username:  ## if not logged in, no session info, redirect to user login
            return redirect('/account/login')
        else:
            pass  ## otherwise, stay on the current page

def getting_started_info(request, positions=[]):
    location = request.session.get('location')
    redirect_filter(request)
    if request.method == 'POST':
        form = GettingStartedForm(request.POST)
        ...(run the function)...
    else:
        form = GettingStartedForm() # inital = {'location': location}
    return render_to_response('registration/getting_started_info1.html', {'form':form, 'positions': positions,}, context_instance=RequestContext(request))

显然,这种观点还没有完全发挥作用。我如何将其转换为功能性的东西?

另外,我有三个变量需要在几个getting_started函数中重用:

user = User.objects.get(email=request.user.username)
profile = UserProfile.objects.get(user=user)
location = profile.location

我将把这些变量定义放在哪里,以便我可以在所有函数中重用它们,我将如何调用它们? 谢谢。

1 个答案:

答案 0 :(得分:2)

Django实际上已经包含了一个login_required装饰器,它使处理用户身份验证变得微不足道。只需在view.py页面顶部包含以下内容:

from django.contrib.auth.decorators import login_required

然后添加

@login_required 

在任何需要登录的视图之前。它甚至会在用户登录后将用户重定向到相应的页面。

更多信息: https://docs.djangoproject.com/en/dev/topics/auth/#the-login-required-decorator

这应该会大大简化您的视图,并且可能导致不必编写单独的类,因为剩下的只是一个简单的重定向。

对于变量,每个请求都包含一个request.user对象,其中包含有关用户的信息。您可以在文档中搜索请求和响应对象以了解更多信息。

您可以通过扩展用户模块来使用该用户对象来获取配置文件变量。在您的设置中设置AUTH_PROFILE_MODULE ='myapp.UserProfile',这将允许您访问用户配置文件,如下所示:

user.get_profile().location. 

更多相关信息: http://www.b-list.org/weblog/2006/jun/06/django-tips-extending-user-model/