1. 如何注册用户
有以下几种设计:
- 切换到另一个页面,一个注册页面,里面有用户名密码确认密码 注册按钮。
- 直接使用用户在登陆界面输入的用户名/密码,进入后台完成注册,给用户弹窗提示注册成功!
- 弹出一个弹层,上面有用户名/密码输入框和注册按钮。
- 弹出一个弹窗,上面显示“公司内部平台,注册账号需要联系xxx” 然后等别人联系你了,再由你去数据库后台去创建这个用户
按照最简单的方式来,重点是之后的接口测试模块,并不是用户管理模块。所以选择第2种,简单粗暴。
2. 打开login.html,找到注册按钮,是一个a标签,a标签不但在href属性中可以写一个超链接,也可以在href中写一个js函数。
因为要传递 用户名/密码 作为数据,所以href属性要写一个js函数,取名为:register()。具体写法:javascript:函数名()
<span style="font-size: xx-small">若首次登录,请点击 <a href="javascript:register()">注册账号</a></span>
如图,在script中增加注册的function
接收到返回值后不再直接弹出写死的文案,而是选择弹出请求返回值,具体显示什么由后台决定。而后台的返回值就是ret。所以alert(ret) 。为什么要这么做呢?
因为用户注册最少有两种结果:
- 注册成功
- 用户已存在注册失败
- 其他问题,如密码过短等等违反你自己定义的规则
所以为了后续方便我们增加规则等这样做就会很方便。
3. 添加映射
url.py
url(r'^register_action/$', register_action), # 注册
views.py
def register_action(request):
username = request.GET['username']
password = request.GET['password']
# 开始 联通django用户表
try:
user = User.objects.create_user(username=username, password=password)
user.save()
return HttpResponse('注册成功')
except:
return HttpResponse('注册失败~用户名好像已经存在了~')
这里可以看到,依然是先获取到了前端给的用户名/密码。
然后从这个django.contrib/auth.models 库里倒入里User方法。(其实User是orm方式操作用户表的实例)
然后直接用User.objects.create_user方法生成一个用户,参数为用户名和密码。然后保存这个生成的用户就是注册成功了。
但是如果用户表中已存在这个用户名,那么,这个生成语句就会报错。所以我们用try来捕获这个异常,如果发送错误那就是“用户已经存在”,如实给用户返回这句话。如果没问题,那么就返回 注册成功。
现在刷新页面来测试,先登陆一个账号:用户名 测试开发干货 密码123。
点击登陆,提示用户名密码错误。因为这时候还不存在这个账号
点击注册账号,提示注册成功
再点击注册按钮!
再点击登录
重点来了!仍然报错哦!
引入新知识点:前端想给后端传数据,发送请求,如果不是表单提交,或者超链接,只用异步接口请求(就是我们前面用的$.get(“url”,{参数}{返回动作函数})) 的话,那么后端无论怎么写重定向语句,都是徒劳的,前端并不会直接跳转去/home/。
但是我们又不想去大改前端的登陆架构,用什么办法弥补呢?
答案很简单,后端可以返回诸如 True/False 0/1 成功/失败 这种字符串。因为前端的js函数里接受到ret就是这个后端返回的字符串。所以前端js可以根据这个ret来作出不同的处理,比如跳转到/home/。
这就像雨化田台词 :你东厂办不了的事,禀告我们西厂,我们西厂来办。你们管的了的我们要管,管不了的我也要管,先斩后奏,皇权特许,这!就是西厂,够不够清楚?
所以赶在这次就会,就要训练好我们的应急处理能力,将来线上出现bug,我们要以最小代价紧急修复的次数不会少。你不那每次都完全重构吧?所以这里给大家埋了一个坑,提升一下这方面的经验。
那么现在修改后端login()函数,让他别操心的重定向了,直接就返回 成功 还是 失败 就行,其余的事交给前端js
然后回到前端js,改动如图:
现在我们去试登陆一下:用户名:测试开发干货,密码:123
4. 校验登录态
密码要想显示*****,只需要给input标签 的type属性 从text改成password即可
直接访问:http://127.0.0.1:8000/home/ ,目前可以直接访问,因为进入home页面的函数 home() 没有强制要求登陆
所以django是默认放行的。那么要如何避免这种钻空子的状况呢?
解决:首先我们要给home()函数 加上django自带的登陆态检查装饰符login_required ! 导入后,直接加在home函数头上即可!
看看效果:
再去修改login函数中成功登陆的分支,给他加上:
如果用户一但登陆成功,就调用django的真正登陆函数auth.login。把这个登陆状态也就是成功的用户名当作session写进用户的浏览器内,之后用户就可以成功进入各个页面了。
auth.login(request, user)
request.session['user'] = username
现在我们再来试试看:
-
非登陆状态 无法直接进入/home/ , 报错
-
登陆状态进入/home/ 成功进入home.html
-
先进入/login/ ,登陆成功,发现成功跳转到home.html
5. 完善:就是当用户非登陆状态,直接进入/home/时不应该报错,而是跳转login.html登陆。所以继续改动俩个地方:
- welcome函数 也加上 登陆态检查装饰符,之后我们几乎每个重要页面都要加上这个装饰符
- urls.py加入非登陆状态自动跳到登陆页面的映射
下期:退出功能实现 + 熟悉django自带后台管理平台