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如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
    <form action="{% url 'login:do_login' %}" method="post">
        {% csrf_token %}
        <label for="username">用户名:</label>
        <input id="username" type="text" name="username" value="{{ username }}"><br/>
        <label for="password">密码:</label>
        <input id="password" type="password" name="password" value="{{ password }}"><br/>
        <input type="submit" value="登录">
    </form>
</body>
</html>

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

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>主页</title>
<body>
    欢迎,{{ username }}
</body>
</html>

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实体类来创建对应的用户。不过还有一种简单的方法,可以登录管理员界面,其中可以添加用户。




版权声明:本文为yjp19871013原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。