开发者

Converting separate functions into class-based

I have several function that need to have a 'redirect' filter. The redirect filter goes something like this --

1) if a user is not logged in and has no session data, redirect to login page.

2) if a user is logged in and has already filled out the page, redirect to user home.

3) if a user is logged in and has not already filled out the page, stay on the page.

4) if a user is not logged in and has session data, stay on the page

I've started to convert the functions into a class-based approach to make it more efficient and less code (previously my view functions were pretty massive). This is my first stab at trying make something class-based, and this is what I have so far --

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 rend开发者_开发百科er_to_response('registration/getting_started_info1.html', {'form':form, 'positions': positions,}, context_instance=RequestContext(request))

Obviously, this view is not fully working yet. How would I convert this into something that's functional?

Also, I have three variables that will need to be reused in several of the getting_started functions:

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

Where would I put these variable definitions so I can reuse them in all the functions, and how would I call them? Thank you.


Django actually already includes a login_required decorator that makes handling user authentication trivial. Just include the following at the top of your view.py page:

from django.contrib.auth.decorators import login_required

and then add

@login_required 

before any views that require a login. It even handles redirecting the user to the appropriate page once they log in.

More info here: https://docs.djangoproject.com/en/dev/topics/auth/#the-login-required-decorator

This should greatly simplify your views, and may result in not having to write a separate class, since all that's left is a simple re-direct.

As for the variables, each request already contains a request.user object with information on the user. You can do a search in the docs for Request and response objects to learn more.

You can use that user object to get the profile variable by extending the user module. Set AUTH_PROFILE_MODULE = 'myapp.UserProfile' in your Settings, which will allow you to access a users profile as follows:

user.get_profile().location. 

More about that here: http://www.b-list.org/weblog/2006/jun/06/django-tips-extending-user-model/

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜