需求:开发一个用户登录功能
1、写一个登录功能
前端页面
首先从前端页面开始,打开.../sign/templates/index.html,开发一个表单
<html> <head> <title>Django Page</title> </head> <body> <h1>发布会管理</h1> <form method="post"> <input name="username" type="text" placeholder="请输入用户名"><br> <input name="password" type="password" placeholder="请输入密码"><br> <button id="btn" type="submit">登录</button> </form> </body> </html>
启动Django服务,访问:http://127.0.0.1:8000/index/ 如图所示
登录,弹出“CSRF verification failed. Request aborted.”,这是因为CSRF(Cross-site request forgery)跨站请求伪造,Django针对CSRF的保护措施是在生成的每个表单中放置一个自动生成的令牌,通过这个令牌判断POST请求是否来自同一个网站。这里要用到Django的“标签模板”添加CSRF令牌。
...... <form method="post"> <input name="username" type="text" placeholder="请输入用户名"><br> <input name="password" type="password" placeholder="请输入密码"><br> <button id="btn" type="submit">登录</button> {% csrf_token %} </form> ......
刷新,重新登录,错误提示消失了。
也可以注释掉CSRF请求,在../guest/settings.py中
'django.middleware.csrf.CsrfViewMiddleware',
处理登录请求
1、form表单的action属性指定提交的路径。打开inde.html文件,添加如下:
form method="post" action="/login_action/">
2、添加路由,打开../guest/urls.py
url(r'^login_action/$', views.login_action),
3、添加视图,打开sign/views.py,添加login_action函数
from django.http import HttpResponse from django.shortcuts import render # Create your views here. def index(request): return render(request, "index.html") def login_action(request): if request.method == 'POST': username = request.POST.get('username', '') password = request.POST.get('password', '') if username == 'admin' and password == 'admin123': return HttpResponse('login success!') else: return render(request, 'index.html', {'error': 'username or password error!'})
4、前端添加返回错误信息的地方,打开inde.html,使用Django的模板
<form method="post" action="/login_action/"> <input name="username" type="text" placeholder="请输入用户名"><br> <input name="password" type="password" placeholder="请输入密码"><br> {{ error }} <br> <button id="btn" type="submit">登录</button> {% csrf_token %} </form>
{{ error }} 对应render返回的字典中的key,即“error”,登录失败页面中显示对应的value,即‘username or password error!’
5、刷新页面,登录。
将登录请求跳转到指定页面
1、创建../templates/event_manage.html页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Event Manage Page</title> </head> <body> <h1> Login Success! </h1> </body> </html>
2、修改views.py文件
from django.http import HttpResponseRedirect from django.shortcuts import render # Create your views here. def index(request): return render(request, "index.html") def login_action(request): if request.method == 'POST': username = request.POST.get('username', '') password = request.POST.get('password', '') if username == 'admin' and password == 'admin123': return HttpResponseRedirect('/event_manage/') else: return render(request, 'index.html', {'error': 'username or password error!'}) # 发布会管理 def event_manage(request): return render(request, "event_manage.html")
HttpResponseRedirect类可以对路径重定向,从而将登录请求成功的请求指向/event_manage/目录
3、添加路由
url(r'^event_manage/$', views.event_manage),
4、刷新,登录
Cookie的使用
修改.../sign/views.py文件:
def login_action(request): if request.method == 'POST': username = request.POST.get('username', '') password = request.POST.get('password', '') if username == 'admin' and password == 'admin123': response = HttpResponseRedirect('/event_manage/') # 添加cookie: key,value,有效期 response.set_cookie('user', username, 3600) return response else: return render(request, 'index.html', {'error': 'username or password error!'}) # 发布会管理 def event_manage(request): username = request.COOKIES.get('user', '') # 读取浏览器cookie return render(request, "event_manage.html", {"user": username})
修改.../templates/event_manage.html页面,添加<div>标签来显示用户登录的用户名:
<div style="float: right;"> <a>嘿!{{ user }} 欢迎</a><hr/> </div>
刷新,重新登录,如下图所示:
session的使用
1、修改一下代码
修改.../sign/views.py文件,在login_action函数中,将:
response.set_cookie('user',username,3600)
替换为:
request.session['user']=username #将session信息记录到浏览器
在event_manage函数中,将:
username=request.COOKIES.get('user','')
替换为:
username=request.session.get('user','') #读取浏览器session
2、创建一个存session的数据库sqlite
python manage.py migrate
3、刷新,登录
2、Django认证系统
登录admin后台
1、创建admin后台用户名密码:python manage.py createsuperuser
设置用户名/密码:admin / zlm111222
2、通过URL地址:http://127.0.0.1:8000/admin/ 来访问Django自带的Admin管理后台
引用Django认证登录
打开.../sign/views.py文件修改login_action函数
def login_action(request): if request.method == 'POST': username = request.POST.get('username', '') password = request.POST.get('password', '') # 使用authenticate()函数认证给出的用户名和密码。它接受两个参数,用户名username和密码password # 并在用户名密码正确的情况下返回一个user对象。如果用户名密码不正确,则authenticate()返回None user = auth.authenticate(username=username, password=password) if user is not None: auth.login(request, user) # 登录 request.session['user'] = username # 将session信息记录到浏览器 response = HttpResponseRedirect('/event_manage/') return response else: return render(request, 'index.html', {'error': 'username or password error!'})
关上窗户
1、http://127.0.0.1:8000/event_manage/ 可以直接打开登录成功页,我们需要把这个窗户关上,只需要如下修改:
from django.contrib import auth ..... # 发布会管理 @login_required def event_manage(request): username = request.session.get('user', '') return render(request, "event_manage.html", {"user": username})
再次尝试访问/event_manage/目录(千万不要忘记清理浏览器缓存再试!),Django会告诉访问的路径并不存在(404)。
2、修改.../urls.py文件,添加以下路径
url(r'^accounts/login/$', views.index),
现在访问以下url都能跳转到登录页面了
http://127.0.0.1:8000/
http://127.0.0.1:8000/index/
http://127.0.0.1:8000/event_manage/