利用Django开发个小型商城(二)
完善用户模块 - 注册功能
现在访问我们的注册页 /user_register
我们先来编写注册的逻辑
在 user/view.py 中添加注册页面 post方法.我们先直接返回提交的数据
class RegisterView(View):
def get(self,request):
return render(request,'user/register.html')
def post(self,request):
return HttpResponse(json.dumps(request.POST))
记得在表单中添加 csrf的token认证
{% csrf_token %}
我们提交表单 查看接收的参数.
很多初学者可能对csrf 的概念不是很了解.下面我简单说明一下.
CSRF(Cross Site Request Forgery)即跨站请求伪造。就是利用后台有规律的接口,例如 localhost/deleteAriticle.php?id=3&username=xiaoxiao
攻击者在被攻击的网站页面嵌入这样的代码,当用户xiaoxiao访问该网站的时候,会发起这条请求。服务器会删除id为3的数据。
客户端防范:对于数据库的修改请求,使用POST提交,避免使用GET请求。
服务器端防范:一般的做法是在表单里面添加一段隐藏的唯一的token(请求令牌)。
上面举的例子是删除,如果是转账方面的呢,那么用户的损失就会很大了.
好了,我们继续。拿到这些参数后,我们需要做如下几步:
- 判断两次密码是否一致
- 判断数据库中是否存在同样的用户名
- 将数据存入数据库
- 用户注册成功
但是如果注册失败,那如何提示用户呢?我们可以做页面提示框
<script type="text/javascript" >
alert('登录失败')
</script>
问题又来了。这个页面不止一种错误提示.类似的还有用户名已经存在的错误
我们可以把错误信息传给页面. 逻辑都有了,可以继续编码了.
下面是注册的实现代码:(user文件夹下view.py文件)
import json
import datetime
import hashlib
from django.shortcuts import render,HttpResponse
from django.views.generic.base import View
from user.models import User
from django.core.exceptions import ObjectDoesNotExist
# Create your views here.
class LoginView(View):
def get(self,request):
# 渲染登录页面
return render(request,'user/login.html')
def post(self,request):
# 登录逻辑
return HttpResponse(json.dumps(request.POST))
class RegisterView(View):
def get(self,request):
return render(request,'user/register.html')
def post(self,request):
username = request.POST.get('user_name','')
password = request.POST.get('pwd','0')
cpassword = request.POST.get('cpwd','1')
# 判断两次密码是否一致
if password != cpassword:
return render(request, 'user/register.html', {"message": '两次密码不一致'})
# 判断用户名是否已经存在
if username == '':
return render(request, 'user/register.html', {"message": '请输入用户名'})
try:
User.objects.get(uname=username)
return render(request, 'user/register.html', {"message": '用户名已经存在'})
except ObjectDoesNotExist:
pass
# 写入数据库
userModel = User()
userModel.uname = username
# md5 加密
hl = hashlib.md5()
hl.update(password.encode(encoding='utf-8'))
userModel.upwd = hl.hexdigest()
# 获取当前时间
now = datetime.datetime.now()
nowTime = now.strftime('%Y-%m-%d %H:%M:%S')
userModel.create_at = nowTime
userModel.update_at = nowTime
userModel.save()
# 返回结果
return render(request,'user/register.html',{"message":'注册成功'})
页面中提示的代码:
{% if message %}
<script type="text/javascript" >
alert('{{ message }}')
</script>
{% endif %}
我们主要来对这两段代码进行解释:
# 判断用户名是否已经存在
if username == '':
return render(request, 'user/register.html', {"message": '请输入用户名'})
try:
User.objects.get(uname=username)
return render(request, 'user/register.html', {"message": '用户名已经存在'})
except ObjectDoesNotExist:
pass
User.objects.get(uname=username)
从数据库中查询字段 uname = 变量username的内容
在django中如果没有查询到数据会抛出一个ObjectDoesNotExist的异常,在程序中,当然不能直接抛出异常 我们需要对它进行捕获.
这里需要引用一下 from django.core.exceptions import ObjectDoesNotExist
# 写入数据库
userModel = User()
userModel.uname = username
# md5 加密
hl = hashlib.md5()
hl.update(password.encode(encoding='utf-8'))
userModel.upwd = hl.hexdigest()
# 获取当前时间
now = datetime.datetime.now()
nowTime = now.strftime('%Y-%m-%d %H:%M:%S')
userModel.create_at = nowTime
userModel.update_at = nowTime
userModel.save()
首先创建一个 User 对象
user表的字段就是他的属性.
我们可以直接 userModel.uname = username 这样赋值
当然最后我们得userModel.save() 这样才有效. save不但可以用来创建,也可以用来更新.
在操作完save方法后 我们可以通过 userModel.uid 来获取自增id
最后我们保存完数据提示用户注册成功.
return render(request,'user/register.html',{"message":'注册成功'})
这里也是一个alert提示.没有做到好的用户体验.
我们应该有一个跳转页.跳转页中有提示信息.并且几秒后到达登录页面. 我们下一节就来实现一个跳转页.并完成我们的登录功能。
蜗牛博客
请问后面还有吗?
期待一个全的教程。
Hcheng
还会有的.最近这段时间有点忙.没有时间更新.