今天的文章基于之前做的配置,实现一个具体的功能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版权协议,转载请附上原文出处链接和本声明。