django-restful(抢杀)

功能模块分为两大块,分别为简易用户及用户组管理模块以及枪杀模块。

urls设计

/ 首页
/admin 自带用户管理页面
/ctr 用户组管理
/api-auth api认证
/seckill/list 显示所有枪杀商品信息
/seckill/(?P<pk>[0-9]+)/detail 显示某个枪杀商品详细信息
/seckill/time/now 显示当前信息
/seckill/(?P<pk>[0-9]+)/url 暴露抢杀的url
/seckill/setphone 设置电话
/seckill/kill 抢杀

model层

用户管理模块的模型为框架本身所有,抢杀模块的模型包括商品信息,抢杀记录,抢杀地址暴露模型。

seckill/models.py
商品信息

class Seckill(models.Model):
    seckill_id = models.BigIntegerField(primary_key=True)
    name = models.CharField(max_length=120)
    number = models.IntegerField()
    start_time = models.DateTimeField()
    end_time = models.DateTimeField()
    create_time = models.DateTimeField()

    def __unicode__(self):
        return self.name

    class Meta:
        managed = True
        db_table = 'seckill'.

抢杀记录

class SuccessKilled(models.Model):
    id = models.BigIntegerField(primary_key=True)
    seckill_id = models.BigIntegerField()
    user_phone = models.BigIntegerField()
    state = models.IntegerField()
    create_time = models.DateTimeField()

    class Meta:
        managed = True
        db_table = 'success_killed'

暴露url


#商品不存在时
class Exposed(models.Model):
    exposed=models.BooleanField()
    seckill_id=models.BigIntegerField()

#抢杀未开放时
class ExposedNoOpen(Exposed):
    now =  models.DateTimeField()
    start = models.DateTimeField()
    end = models.DateTimeField()

#可抢杀
class ExposedOpen(Exposed):
    md5= models.CharField(max_length=100)

序列化

userAdmin\serializers.py
对User以及Group进行序列化

#对User进行序列化
class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model=User
        fields=('url','username','email','groups')
#对Group进行序列化
class GroupSerializers(serializers.HyperlinkedModelSerializer):
    class Meta:
        model=Group
        fields=('url','name')

seckill\serializers.py
对抢杀模型进行序列化

# 抢杀商品的序列化
class SeckillSerializer(serializers.ModelSerializer):
     class Meta:
         model=Seckill
         fields=('seckill_id','name','number','start_time','end_time','create_time')


class SuccessKilledSerializer(serializers.ModelSerializer):
    class Meta:
        model = SuccessKilled
        fields = ('seckill_id', 'user_phone', 'state', 'create_time')

class ExposedNoIdSerializer(serializers.ModelSerializer):
    class Meta:
        model = Exposed
        fields = ('exposed', 'seckill_id')

class ExposedNoOpenSerializer(serializers.ModelSerializer):
    class Meta:
        model = ExposedNoOpen
        fields = ('exposed', 'seckill_id', 'now', 'start','end')

class ExposedOpenSerializer(serializers.ModelSerializer):
    class Meta:
        model = ExposedOpen
        fields = ('exposed', 'seckill_id', 'md5')

视图的实现

用户管理的视图


#首页显示欢迎字符
def index(request):
    return HttpResponse(u"欢迎进入抢杀!")

#用户信息的输出
class UserViewSet(viewsets.ModelViewSet):
    """
    用户界面
    """
    queryset=User.objects.all().order_by('-date_joined')
    serializer_class = UserSerializer

#组的输出
class GroupViewSet(viewsets.ModelViewSet):
    """
    组界面
    """
    queryset=Group.objects.all()
    serializer_class = GroupSerializers

抢杀的视图

#抢杀商品的显示和新建
class SeckillList(generics.ListCreateAPIView):
    queryset = Seckill.objects.all()
    serializer_class = SeckillSerializer

#抢杀商品的详细信息
class seckill_detail(viewsets.ViewSet):
    def retrieve(self, request,pk=None):
        queryset = Seckill.objects.all()
        user = get_object_or_404(queryset, pk=pk)
        serializer = SeckillSerializer(user)
        return Response(serializer.data)

#显示当前时间
@api_view(['GET'])
def seckill_time(request):
        now=datetime.datetime.fromtimestamp(time.time())
        now={"now":now}
        return Response(now)

#暴露url
@api_view(['GET'])
def expose_url(request,pk):
#是否存在商品信息,不存在则显示相关信息
    try:
       seckill = Seckill.objects.get(seckill_id=pk)
    except:
        return Response(ExposedNoIdSerializer(Exposed(exposed=False,seckill_id=pk)).data)

#检验是否在抢杀时间范围内,如果不在,则显示相关信息
    now=datetime.datetime.fromtimestamp(time.time())
    start=seckill.start_time.replace(tzinfo=None)
    end=seckill.end_time.replace(tzinfo=None)
    print now,start,end
    if start > now or end < now:
        nowStr=now.strftime('%Y-%m-%d %H:%M:%S')
        staStr = start.strftime('%Y-%m-%d %H:%M:%S')
        endStr = end.strftime('%Y-%m-%d %H:%M:%S')
        return Response(ExposedNoOpenSerializer(ExposedNoOpen(exposed=False,seckill_id=pk,now=nowStr,start=staStr,end=endStr)).data)
    md5=getMd5(pk)
    print ExposedOpenSerializer(ExposedOpen(exposed=True, seckill_id=pk, md5=md5)).data
#如果在暴露时间范围内,则暴露信息,暴露失败则显示暴露失败
    try:
       return Response(ExposedOpenSerializer(ExposedOpen(exposed=True,seckill_id=pk,md5=md5)).data)
    except:
        return Response({'error':'暴露失败!'})

#其中getMd5()的函数如下:
# coding:utf-8
import hashlib

def getMd5(ac):
    salt='/hferjberg'
    value=str(ac)+salt
    m5=hashlib.md5()
    m5.update(value)
    return m5.hexdigest()


#设置手机号码,保存到session中
@csrf_exempt
def set_phone(request):
    if request.method == 'POST':
        phone=request.POST.get('phone','')
        request.session['phone']=phone
        return HttpResponseRedirect('./kill')
    else:
        return HttpResponse("set failure.")

#显示抢杀信息及进行抢杀
@api_view(['GET','POST'])
def killone(request):
    """
    :param request:
    :return:
    """
    #显示抢杀信息
    if request.method == 'GET':
        successKilled=SuccessKilled.objects.all()
        serializer=SuccessKilledSerializer(successKilled,many=True)
        return Response(serializer.data)

    #进行抢杀
    if request.method == 'POST':
            print request.data
            user_phone = long(request.data['user_phone'])
            seckill_id = long(request.data['seckill_id'])
            #判断发送的phone与session中的是否一致,不一致则返回号码不对
            if user_phone!=request.session.get('phone',''):
                print request.session.get('phone','')
                return Response({'message':'电话号码不对'})
            #判断seckill_id是否存在,不存在则显示秒杀商品不存在
            if seckill_id not in [i.seckill_id for i in Seckill.objects.all()]:
                print seckill_id==1000L
                print [i.seckill_id for i in Seckill.objects.all()]
                return Response({'message':'秒杀商品不存在'})
            #获取该商品信息
            seckill = Seckill.objects.get(seckill_id=seckill_id)
            #判断是否在抢杀时间范围内,如果不在,则显示对应信息
            if datetime.datetime.fromtimestamp( time.time())<seckill.start_time.replace(tzinfo=None):
                return Response({'message':'还未开始'})
            if datetime.datetime.fromtimestamp(time.time()) > seckill.end_time.replace(tzinfo=None):
                return Response({'message':'已经结束'})
            
            #判断抢杀是否重复
            idstr = [str(i.seckill_id) for i in SuccessKilled.objects.all()]
            phstr = [str(i.user_phone) for i in SuccessKilled.objects.all()]
            if str(user_phone)+str(seckill_id) not in [phstr[i]+idstr[i] for i in range(len(phstr))]:
                #对商品数减1
                seckill.number=seckill.number-1
                seckill.save()
                #返回相应信息
                obj=SuccessKilled(seckill_id=seckill_id, user_phone=user_phone,state=1,create_time=seckill.create_time)
                return Response({'mesage':'抢杀成功'})
            else:
                return Response({'message':'重复秒杀'})
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容