Django+mysql-第十六篇(大堂点餐:登录页面校验、登录中间件)


博客目录:

......

十三、基于Django+mysql的点餐系统设计-第十三篇(H5点餐:订单的展示)

十四、Django+mysql(大堂点餐:需求分析和代码逻辑实现梳理、首页展示)

十五、基于Django+mysql的点餐系统设计-第十五篇(大堂点餐:登录)

十六、Django+mysql-第十六篇(大堂点餐:登录页面校验、登录中间件)


本章源码下载地址:https://github.com/hopeSuceess/testorder/tree/testorder_2022071001


  本章重点讲的功能是登录页面的各种异常情况校验。在系统正式工作流程中,不仅要保障正常流,用户的异常操作也要考虑。登陆页面有商铺、验证码、账号、密码等选择/填写项,那么就需要对这些字段的填写进行校验,包括但不限于非空、填写错误等异常操作。

  异常登录的校验主要在执行登录的逻辑实现,具体的判断在后端,异常反馈在前端。在web/views/index.py的dologin函数添加判断校验逻辑

def dologin(request):
    ''' 执行登录操作 '''
    try:
        #执行是否选择店铺判断
        if request.POST['shop_id'] == '0':
            return redirect(reverse('web_login')+"?typeinfo=1")

        # 执行验证码的校验
        if request.POST['code'] != request.session['verifycode']:
            return redirect(reverse('web_login')+"?typeinfo=2")

        # 根据登录账号获取登录者信息
        user = User.objects.get(username=request.POST['username'])
            # 判断当前用户是否正常或管理员
        if user.status == 6 or user.status == 1:
            # 判断登录密码是否相同
            import hashlib
            md5 = hashlib.md5()
            s = request.POST['pass'] + str(user.password_salt) # 从表单重获取密码并添加干扰值
            md5.update(s.encode('utf-8')) # 将要产生md5的字串放进去
            if user.password_hash == md5.hexdigest():  # 获取md5值
                print("登录成功!")
                # 将当前登录成功的用户信息以webuser为key写入到session中
                request.session['webuser'] = user.toDict()

                # 获取当前店铺信息
                shopob = Shop.objects.get(id=request.POST['shop_id'])
                request.session['shopinfo'] = shopob.toDict()
                # 获取当前店铺中所有菜品类别和菜品信息
                clist = Category.objects.filter(shop_id = shopob.id, status=1)
                categorylist = dict() # 菜品类别(内含有菜品信息)
                productlist = dict() # 菜品信息
                for vo in clist:
                    c = {'id': vo.id, 'name': vo.name, 'pids':[]}
                    plist = Product.objects.filter(shop_id=shopob.id,category_id=vo.id,status=1)
                    for p in plist:
                        c['pids'].append(p.toDict())
                        productlist[p.id] = p.toDict()
                    categorylist[vo.id] = c
                request.session['categorylist'] = categorylist #菜品类别列表
                request.session['productlist'] = productlist #菜品列表
                #重定向到前台大堂点餐首页
                return redirect(reverse("web_index"))
            else:
                return redirect(reverse('web_login')+"?typeinfo=5")
        else:
            return redirect(reverse('web_login')+"?typeinfo=4")
    except Exception as err:
        print (err)
        return redirect(reverse('web_login')+"?typeinfo=3")


  后端判断逻辑最终需要通过前端展现出来,前端写一个p模块,接收后端传过来的信息并展现在页面上


......
           

{% if request.GET.typeinfo == '1' %}

请选择您所在的商铺!

{% elif request.GET.typeinfo == '2' %}

验证码错误!

{% elif request.GET.typeinfo == '3' %}

登录账号不存在!

{% elif request.GET.typeinfo == '4' %}

此用户非管理账号!

{% elif request.GET.typeinfo == '5' %}

登录密码错误!

{% endif %}


 ......



  启动工程,访问http://127.0.0.1:8000/login,当不输入信息或输入有误时,有了报错提示:

  登录校验的功能是不是很简单,接下来继续讲登录中间件。现在直接访问登录页面,账号密码等信息填写正确可以跳转到餐品首页,如果有人跳过登录,直接访问餐品首页,该怎么办呢?这里就用到了登陆中间件去拦截:在访问餐品首页等页面的链接时,首要校验是否有用户信息,有用户信息可以正常访问,没有用户信息,拦截访问链接强制跳转到登录页面。

  登录短链接/mobile/register,/mobile/doregister可以直接访问,其他短链接访问都需要进行登录判断,在缓存中匹配到用户信息,可以正常操作;如果在缓存中没有匹配到用户信息,重定向到登录页。

#判断大堂点餐是否登录

urllist = ['login', 'dologin','verify']
if re.match(r"/web", path) and (path not in urllist):
    if "webuser" not in request.session:
        return redirect(reverse("web_login"))

......

  启动工程,清理缓存,访问localhost:8000/web,跳转到了登录页面,正常

  好了,登录校验和登录中间件就说到这,下一篇文章讲大堂点餐的购物车。





#头条创作挑战赛#

展开阅读全文

页面更新:2024-04-26

标签:大堂   中间件   页面   首页   用户信息   账号   逻辑   异常   密码   信息

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top