Django实现用户登录

今天的文章基于之前做的配置,实现一个具体的功能Demo——登录。在login的templates目录下创建两个模板,分别是login.html和home.html,当用户未登录时,跳转到login.html页面,登陆成功或者登录状态,跳转到home.html。


url的配置主要有两个,django_demo下的urls.py,内容如下:

from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/', include('login.urls')),
]

然后是login下的urls.py:

app_name = 'login'
urlpatterns = [
    url('^$', views.home, name='home'),
    url('^do_login/$', views.do_login, name='do_login')
]

两份配置共同定义了两个可访问的url:

http://ip:port/login/

http://ip:port/login/do_login/


看一下两个页面,做的很简单也不美观,主要为了说明功能。login.html如下:




    
    登录


    
{% csrf_token %}


其中用到了Django的模板,{% url %}用来通过url配置中的name参数反向求解,对于本例,就是http://ip:port/login/do_login/。{{...}}用来映射render给模板的参数,接下来的views.py会看到对应的代码。然后是home.html




    
    主页

    欢迎,{{ username }}


login/views.py中的import如下

from django.shortcuts import render, redirect, reverse
from django.contrib.auth.decorators import login_required
from django.contrib.auth import authenticate, login

然后是上面urls.py配置中用到的两个函数,先看home

@login_required(login_url='/login/do_login')
def home(request):
    return render(request,
                  'home.html',
                  {'username': request.user.username})

home函数前添加了login_requeried修饰符,该修饰符用来说明执行home前需要登录,登录的url是/login/do_login/。而home函数很简单,就是返回渲染后的home.html模板,向模板传递了当前登陆的用户名。看看do_login做了什么。

def do_login(request):
    if request.method == 'GET':
        return render(request, 'login.html')

    username = request.POST.get('username', '')
    password = request.POST.get('password', '')

    user = authenticate(request, username=username, password=password)
    if user is not None:
        login(request, user)
        return redirect(reverse('login:home'))
    else:
        return render(request, 'login.html', {
            'username': username,
            'password': password,
        })

do_login的代码实际上可以作为标准的login流程,首先获取用户名和密码,然后通过authenticate方法进行校验,如果该用户存在,会返回用户对象,通过login函数执行登录,如果用户不存在,返回到login.html页面。


这样,登录实例就完成了。可以运行服务器,通过admin用户登录看看。不过有一个问题,现在没有注册,我们可以添加用户吗?当然可以,一种方法是使用上一篇文章的方法,通过创建User实体类来创建对应的用户。不过还有一种简单的方法,可以登录管理员界面,其中可以添加用户。



你可能感兴趣的:(Python,Django)