django视图

继续在django入门的基础上开发,不过这一次选择先从前端页面开始,打开/sign/templates/index.html文件,开发一个登录表单,index.html的代码如下:

django视图

 

启动django服务,访问http://127.0.0.1:8000/index/,如下图所示:

django视图

 

给form表单添加属性method="get",get是从指定的资源请求数据

django视图

保存index.html文件,刷新登录页面,输入用户名和密码(admin/admin123),点击登录按钮,查看浏览器url是http://127.0.0.1:8000/index/?username=admin&password=admin123

 

同样是上面的代码,将form表单中的属性改为method="post",post是向指定的资源提交要被处理的数据

django视图

保存index.html文件,刷新登录页面,输入用户名和密码(admin/admin123),点击登录按钮,弹出CSRF verification failed.Request aborted.,CSRF是跨站请求伪造漏洞,django针对CSRF的保护措施是在生成的每个表单中放置一个自动生成的令牌,通过这个令牌判断post请求是否来自同一个网站,在表单中添加{% csrf_token %},如下图:

django视图

刷新页面重新提交表单,错误提示就消失了

 

处理登录请求:

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

django视图

如图是则通过HttpResponse类返回字符串'login success!',否则将通过render返回index.html登录页面,并且顺带返回错误提示的字典{'error': 'username or password error!'},但是登录页面没有显示错误提示的位置,打开index.html修改如下:

django视图

现在分别看看登录成功和失败的效果:

django视图

django视图

 

如图是则通过HttpResponse类返回字符串'login success!',否则将通过render返回index.html登录页面,并且顺带返回错误提示的字典{'error': 'username or password error!'},但是登录页面没有显示错误提示的位置,打开index.html修改如下:

django视图

现在分别看看登录成功和失败的效果:

django视图

django视图

 

没有问题之后要通过html页面来替换,发布会签到系统登录之后应该显示发布会管理页面,首先创建\sign\templates\event_manage.html页面

django视图

打开sign\views.py,修改内容如下:

django视图

HttpResponseRedirect类,可以对路径进行重定向,从而将登录成功之后的请求指向/event_manage/目录,即http://127.0.0.1:8000/event_manage/,创建event_manage函数,用于返回发布会管理页面event_manage.html,最后不要忘记在ssj/urls.py文件中添加event_manage/的路由,如下图:

django视图

 

在登录成功页显示"嘿, admin 你好!",通过Cookie实现,首先修改sign/views.py文件

django视图

当用户登录成功后,在跳转到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>标签来显示用户名,如下图:

django视图

重新登录,将会看到Login Success!的页面,右上角显示嘿! admin 欢迎,比较遗憾我的页面里没有看到admin,排查了好长时间

django视图django视图

 

 

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数据库的配置

django视图

此时先来验证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/

django视图

输入正确的用户名和密码,点击Log in按钮,进入下面的页面

django视图django视图

 单击Users后面的Add链接,添加新的用户,输入用户名laosun0204,密码输入sun123456!,确认密码输入sun123456!,点击SAVE按钮,并且用新创建的用户再次登录后台登录失败,必须使其成为staff status才可以登录成功


 django视图

django已帮我们封装好了用户认证和登录的相关方法,只需拿来使用即可,并且同样使用auth_user表中的数据进行验证,前面已经通过Admin后台向该表中添加了用户信息,打开sign/views.py文件,修改login_action函数

django视图

添加了上图中红框里的代码,使用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

django视图

如果想限制某个视图函数必须登录才能访问,则只需在这个函数的前面加上@login_required的装饰即可,再次访问/event_manage/目录(不要忘记清理浏览器缓存再试!),提示入下图:

django视图

如果足够细心,就可以发现在访问被@login_required装饰的视图时,默认跳转的url中会包含"/accounts/login/",修改urls.py文件,增加新的路径配置,如下图红框中的代码:

django视图

此时当用户访问http://127.0.0.1:8000/,http://127.0.0.1:8000/index/,http://127.0.0.1:8000/event_manage/,默认会跳转到发布会管理登录页面,但是如果你访问的其他不存在的路径,比如/abc/,则会报404,这个时候需要设置默认的404页面,会在项目部署一章来添加这个页面