1
votes

I am now working on a system using the Django framework. I am writing the user login part. It seems successful but it doesn't work very well.

  • The login system can recognise the user by his/her username and password.
  • The authentication could only last for one "webpage". When I loaded another page or even reloaded the page, django can't get the info of the user(seems logged out)
  • If I looked at the page resources, I saw a session number made after the login process.

What should I do to ensure only one login is needed? And keep my user logged in during the whole process?

Here is my view file

from django.shortcuts import render
from django.http import HttpResponse,HttpResponseRedirect
from django.template import RequestContext, loader
from django.shortcuts import render
from django.contrib.auth.decorators import login_required
from django.contrib.auth import authenticate, login, logout
from django.shortcuts import render_to_response,redirect
from django.template import RequestContext
from django.views.decorators.csrf import csrf_exempt
from django.template.context_processors import csrf
from . import models
from . import form as f
from django.contrib.sessions.backends.db import SessionStore

def index(request):
    if request.user != None :
        template = loader.get_template('index.html')
        return HttpResponse(template.render(None))
    else :
        return HttpResponseRedirect('/PDT/login_failed')

def Home(request):
    template = loader.get_template('Home.html')
    return HttpResponse(template.render(None))  

def loggin_in(request):
    c = {}
    c.update(csrf(request))
    return render_to_response('login.html', c)

def login_user(request):
    logout(request)
    username = password = ''
    if request.POST:
        username = request.POST.get('username','')
        password = request.POST.get('password','')
        user = authenticate(username=username, password=password)
        if user is not None:
            if user.is_active:
                login(request, user)
                request.session['username']=user.username



                return HttpResponseRedirect('/PDT/logged_successful')
            return HttpResponseRedirect('/PDT/inactive')
        return HttpResponseRedirect('/PDT/incorrect')
    return HttpResponseRedirect('/PDT/login_failed')

def logged_in(request):
    if request.user :
        return render_to_response('index.html',{ 'user' : request.user },context_instance=RequestContext(request))
    else :
        return HttpResponseRedirect('/PDT/login_failed')

def login_failed(request):
    return render_to_response('problem.html',{ 'message' : "Login failed" })

def log_out(request):
    request.session.flush()
    logout(request)
    return render_to_response('problem.html',{ 'message' : "Logged out" })

def inactive(request):
    return render_to_response('problem.html',{ 'message' : "Inactive" })

def incorrect(request):
    return render_to_response('problem.html',{ 'message' : "Incorrect Username or Password" })

def iter_update(request):
    if request.session['username'] != None :
        return render_to_response('iter_update.html',{ 'user' : request.user },context_instance=RequestContext(request))
    else :
        return HttpResponseRedirect('/PDT/login_failed')

def Create_form(request):
    if request.method == "POST":

        form = f.ProjectForm(request.POST)

        if(form.is_valid()):
            print(request.POST['title'])
            form.save()
            message = 'success'
        else:
            message = 'fail'

        return render_to_response('Create_form.html',
              {'message': message,
              'user': request.user,},
              context_instance=RequestContext(request))
    else:
        return render_to_response('Create_form.html',
                {'form': f.ProjectForm()},
                context_instance=RequestContext(request))
2
Please add the relevant settings from your settings file. For authentication to work, you need to have at least the settings as outlined in the documentation. In that case, the currently logged in user is available via request.user automatically. - dhke

2 Answers

2
votes

Please use return render(request, template_name, context_dict) to render templates. Your peculiar way probably strips it of context.

Also, take a look at this decorator, and use it instead of your current if request.user != None : statements.

2
votes

Your user is logged in, but because you are strangely rendering the Home and Index templates via template.render(None), there is no request or user context in your template. Instead, use the render shortcut which runs context processors.