利用Django开发个小型商城(二)

  • 2018-05-06
  • 0
  • 2

完善用户模块 - 注册功能

现在访问我们的注册页 /user_register

image

我们先来编写注册的逻辑

在 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 %}

我们提交表单 查看接收的参数.

image

很多初学者可能对csrf 的概念不是很了解.下面我简单说明一下.

CSRF(Cross Site Request Forgery)即跨站请求伪造。就是利用后台有规律的接口,例如 localhost/deleteAriticle.php?id=3&username=xiaoxiao
攻击者在被攻击的网站页面嵌入这样的代码,当用户xiaoxiao访问该网站的时候,会发起这条请求。服务器会删除id为3的数据。

客户端防范:对于数据库的修改请求,使用POST提交,避免使用GET请求。

服务器端防范:一般的做法是在表单里面添加一段隐藏的唯一的token(请求令牌)。

上面举的例子是删除,如果是转账方面的呢,那么用户的损失就会很大了.

好了,我们继续。拿到这些参数后,我们需要做如下几步:

  1. 判断两次密码是否一致
  2. 判断数据库中是否存在同样的用户名
  3. 将数据存入数据库
  4. 用户注册成功

但是如果注册失败,那如何提示用户呢?我们可以做页面提示框

<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提示.没有做到好的用户体验.

image

我们应该有一个跳转页.跳转页中有提示信息.并且几秒后到达登录页面. 我们下一节就来实现一个跳转页.并完成我们的登录功能。

评论

  • 蜗牛博客

    请问后面还有吗?
    期待一个全的教程。

  • Hcheng

    还会有的.最近这段时间有点忙.没有时间更新.