django视图
继续在django入门的基础上开发,不过这一次选择先从前端页面开始,打开/sign/templates/index.html文件,开发一个登录表单,index.html的代码如下:
启动django服务,访问http://127.0.0.1:8000/index/,如下图所示:
给form表单添加属性method="get",get是从指定的资源请求数据
保存index.html文件,刷新登录页面,输入用户名和密码(admin/admin123),点击登录按钮,查看浏览器url是http://127.0.0.1:8000/index/?username=admin&password=admin123
同样是上面的代码,将form表单中的属性改为method="post",post是向指定的资源提交要被处理的数据
保存index.html文件,刷新登录页面,输入用户名和密码(admin/admin123),点击登录按钮,弹出CSRF verification failed.Request aborted.,CSRF是跨站请求伪造漏洞,django针对CSRF的保护措施是在生成的每个表单中放置一个自动生成的令牌,通过这个令牌判断post请求是否来自同一个网站,在表单中添加{% csrf_token %},如下图:
刷新页面重新提交表单,错误提示就消失了
处理登录请求:
index.html
.....
<form method="post" action="/login_action/">
.....
当我们填写用户名/密码,单机登录按钮时,由http://127.0.0.1:8000/login_action/路径来提交登录请求,所以打开ssj/urls.py文件添加login_action的路由
urls.py
.....
url(r'^login_action/$', views.login_action)
.....
登录请求由views.py视图文件的login_action函数来处理,打开sign/views.py文件,创建login_action视图函数
views.py
如图是则通过HttpResponse类返回字符串'login success!',否则将通过render返回index.html登录页面,并且顺带返回错误提示的字典{'error': 'username or password error!'},但是登录页面没有显示错误提示的位置,打开index.html修改如下:
现在分别看看登录成功和失败的效果:
如图是则通过HttpResponse类返回字符串'login success!',否则将通过render返回index.html登录页面,并且顺带返回错误提示的字典{'error': 'username or password error!'},但是登录页面没有显示错误提示的位置,打开index.html修改如下:
现在分别看看登录成功和失败的效果:
没有问题之后要通过html页面来替换,发布会签到系统登录之后应该显示发布会管理页面,首先创建\sign\templates\event_manage.html页面
打开sign\views.py,修改内容如下:
HttpResponseRedirect类,可以对路径进行重定向,从而将登录成功之后的请求指向/event_manage/目录,即http://127.0.0.1:8000/event_manage/,创建event_manage函数,用于返回发布会管理页面event_manage.html,最后不要忘记在ssj/urls.py文件中添加event_manage/的路由,如下图:
在登录成功页显示"嘿, admin 你好!",通过Cookie实现,首先修改sign/views.py文件
当用户登录成功后,在跳转到event_manage视图函数的过程中,通过set_cookie()方法向浏览器中添加Cookie信息,这里给set_cookie()方法传了三个参数:第一个参数user用于表示写入浏览器的Cookie名,第二个参数username是由用户在登录页上输入的用户名(admin),第三个参数3600用于设置Cookie信息在浏览器中的保持时间,默认单位是秒,在event_manage视图函数中,通过request.COOKIES来读取Cookie名为user的值,并且通过render将它和event_manage.html页面一起返回
修改\templates\event_manage.html页面,添加<div>标签来显示用户名,如下图:
重新登录,将会看到Login Success!的页面,右上角显示嘿! admin 欢迎,比较遗憾我的页面里没有看到admin,排查了好长时间
session的使用,修改sign/views.py文件,下图中加粗的代码就是新增的
response = HttpResponseRedirect('/event_manage/')
request.session['user'] = username # 将session信息记录到浏览器
return response
def event_manage(request):
username = request.session.get('user', '') # 读取浏览器session
return render(request, 'event_manage.html', {'user': username})
再次尝试登录,不出意外的话将会得到一个错误:"no such table:django_session",这个错误跟Session的机制有关,既然要从Web服务器端来记录用户的信息,那么一定要有存放用户sessionid对应信息的地方才行,所有要创建django_session表,Django已经帮我们准备好这些常用的表,只需将它们生成即可,在Terminal里输入python manage.py migrate,显示好多OK,通过migrate命令进行数据迁移,Django已经默认设置sqlite3数据库,在settings.py里查看sqlite3数据库的配置
此时先来验证session功能是否生效,重新登录,查看sessionid,比较遗憾我的页面里没有看到sessionid
django认证系统
到目前为止,虽然实现了登录功能,但用户登录信息的验证是有问题的,目前的做法只是简单地用if语句判断用户名和密码是否为admin/admin123,本节会使用Django的认证系统来实现真正的用户信息验证,migrate命令进行数据迁移时,Django同时也生成了auth_user表,该表中存放的用户信息可以用来登录Django自带的Admin管理后台,在此之前先来创建登录Admin后台的管理员账号,在Terminal里输入python manage.py createsuperuser,通过下面步骤设置用户名、邮箱、密码和确认密码
Username (leave blank to use 'sunshujiang'): admin # 输入用户名
Email address: [email protected] # 输入邮箱
Password: # 输入密码(sun123456!)
Password (again): # 再次输入密码(sun123456!)
创建的超级管理员账号/密码为:admin/sun123456!,Admin管理后台登录地址:http://127.0.0.1:8000/admin/(输入url前起一下服务python manage.py runserver),点击回车url变成http://127.0.0.1:8000/admin/login/?next=/admin/
输入正确的用户名和密码,点击Log in按钮,进入下面的页面
单击Users后面的Add链接,添加新的用户,输入用户名laosun0204,密码输入sun123456!,确认密码输入sun123456!,点击SAVE按钮,并且用新创建的用户再次登录后台登录失败,必须使其成为staff status才可以登录成功
django已帮我们封装好了用户认证和登录的相关方法,只需拿来使用即可,并且同样使用auth_user表中的数据进行验证,前面已经通过Admin后台向该表中添加了用户信息,打开sign/views.py文件,修改login_action函数
添加了上图中红框里的代码,使用authenticate()函数认证给出的用户名和密码,它接受两个参数:username和password,并且会在用户名密码正确的情况下返回一个user对象,否则authenticate()返回None,通过if语句判断authenticate()返回对象,如果不为None,则说明用户认证通过,调用login()函数进行登录,login()函数接收HttpRequest对象和一个user对象
修改event_manage函数,在代码里添加from django.contrib.auth.decorators import login_required以及下图的@login_required
如果想限制某个视图函数必须登录才能访问,则只需在这个函数的前面加上@login_required的装饰即可,再次访问/event_manage/目录(不要忘记清理浏览器缓存再试!),提示入下图:
如果足够细心,就可以发现在访问被@login_required装饰的视图时,默认跳转的url中会包含"/accounts/login/",修改urls.py文件,增加新的路径配置,如下图红框中的代码:
此时当用户访问http://127.0.0.1:8000/,http://127.0.0.1:8000/index/,http://127.0.0.1:8000/event_manage/,默认会跳转到发布会管理登录页面,但是如果你访问的其他不存在的路径,比如/abc/,则会报404,这个时候需要设置默认的404页面,会在项目部署一章来添加这个页面