首页 > 解决方案 > How to properly login user via Django

问题描述

I am trying to login user in Django. If I use the code below everything works fine

def login(request):
    return render(request, 'web/login.html')

def home(request):
    if request.method == 'POST':
        if Member.objects.filter(username=request.POST['username'], password=request.POST['password']).exists():
            member = Member.objects.get(username=request.POST['username'], password=request.POST['password'])

            return render(request, 'web/home.html', {'member': member})
        else:
            context = {'msg': 'Invalid username or password'}
            return render(request, 'web/login.html', context)

Here am trying to perform the same login by processing data using clean_data but it gives error:

The view webApp.views.home didn't return an HttpResponse object. It returned None instead.

Does it mean that my form data is empty or not posted?

I have a reference solution found here but with no luck.

Here is the code:

def login(request):
    return render(request, 'web/login.html')

def home(request):
    if request.method == 'POST':
        form = loginForm(request.POST)
        # check whether it's valid:

        if form.is_valid():
        # process the data in form.cleaned_data as required
            username =  form.cleaned_data['username']
            password =  form.cleaned_data['password']

            #if len(username) < 5 || len(password) < 5:

            if Member.objects.filter(username=username, password=password).exists():
                member = Member.objects.get(username=username, password=password)
                return render(request, 'web/home.html', {'member': member})
                print("success")
            else:
                context = {'msg': 'Invalid username or password'}
                return render(request, 'web/login.html', context)
                print('failed')

标签: django

解决方案


错误的基本思想是,Django 中的任何视图都必须返回HttpResponse或类似的对象。在您看来,您不会HttpResponse一直返回。也就是说,程序执行不会进入if...代码的子句。除非你定义它们,否则执行不能进入else..子句。所以,我添加了一些else条件。

尝试这个

def home(request):
    if request.method == 'POST':
        form = loginForm(request.POST)
        # check whether it's valid:

        if form.is_valid():
            # process the data in form.cleaned_data as required
            username = form.cleaned_data['username']
            password = form.cleaned_data['password']

            # if len(username) < 5 || len(password) < 5:

            if Member.objects.filter(username=username, password=password).exists():
                member = Member.objects.get(username=username, password=password)
                return render(request, 'web/home.html', {'member': member})
                print("success")
            else:
                context = {'msg': 'Invalid username or password'}
                return render(request, 'web/login.html', context)
                print('failed')
        else:
            context = {'msg': 'Form is not valid'}
            return render(request, 'web/login.html', context)
    else:
        context = {'msg': 'HTTP method is not "POST"'}
        return render(request, 'web/login.html', context)

推荐阅读