在订单确认中,涉及到获取参数、校验参数;查询商品数据,判断是否为购物车的商品,遍历商品 id,获取商品信息;读取商品的数量,计算商品的金额,判断库存,需要用户的地址信息。
一、提交订单
① 在提交之前,需要验证用户是否登录
构造登录验证的函数
def login_required_json(view_func):
@wraps(view_func)
def wrapper(request, *args, **kwargs):
if not request.user.is_authenticated():
# 如果用户未登录,返回json数据
return JsonResponse({"code": 1, "message": "用户未登录"})
else:
# 如果用户登录,则进入到视图函数中执行
return view_func(request, *args, **kwargs)
return wrapper
在将登录验证的视图封装到 mixin 类中。
class LoginRequiredJsonMixin(object):
@classmethod
def as_view(cls, **initkwargs):
view = super(LoginRequiredJsonMixin, cls).as_view(**initkwargs)
return login_required_json(view)
② 增加数据库事务功能
事务(Transaction)是并发控制的基本单位。所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。例如,银行转帐工作:从一个帐号扣款并使另一个帐号增款,这两个操作要么都执行,要么都不执行。所以,应该把它们看成一个事务。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。
from django.contrib.auth.decorators import login_required
from django.http import JsonResponse
from functools import wraps
from django.db import transaction
class TransactionAtomicMixin(object):
"""提供数据库事务功能"""
@classmethod
def as_view(cls, **initkwargs):
view = super(TransactionAtomicMixin, cls).as_view(**initkwargs)
return transaction.atomic(view)