前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django实战-信息资讯-付费下载

Django实战-信息资讯-付费下载

作者头像
小团子
发布2019-07-18 16:45:27
7050
发布2019-07-18 16:45:27
举报
文章被收录于专栏:数据云团数据云团

Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。

确认订单,课程购买状态查询,付费下载;确认订单需要 POST 请求后端传入商品名称、支付方式、订单号、价格,然后对接收的值进行 MD5 加密。

代码语言:javascript
复制
key = md5((goodsname + istype + notify_url + orderid + orderuid + price + return_url + token + uid).encode("utf-8")).hexdigest()

python 内置哈希库对字符串进行 md5 加密的方法:首先是导入 md5 加密所需模块:import hashlib 然后创建 md5 对象:m = hashlib.md5() 传入需要加密的字符串进行 md5 加密,然后就可以获取到经过md5加密的字符串了:encodestr = m.hexdigest()。

① 确认订单

代码语言:javascript
复制
def order_key(request):
    goodsname = request.POST.get('goodsname')
    istype = request.POST.get('istype')
    notify_url = request.POST.get('notify_url')
    orderid = request.POST.get('orderid')
    #  orderuid : pays 的 用户 id
    token = 'e6110f92abcb11040ba153967847b7a6'
    orderuid = str(request.user.pk)
    uid = '49dc532695baa99e16e01bc0'
    price = request.POST.get('price')
    return_url = request.POST.get('return_url')

    key = md5((goodsname + istype + notify_url + orderid + orderuid + price + return_url
               + token + uid).encode("utf-8")).hexdigest()
    return restful.result(data={"key": key})

② 购买状态查询

django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。

全局

中间件 django.middleware.csrf.CsrfViewMiddleware

局部

@csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便 settings 中没有设置全局中间件。

@csrf_exempt,取消当前函数防跨站请求伪造功能,即便 settings 中设置了全局中间件。

代码语言:javascript
复制
@csrf_exempt
def notify_view(request):
    orderid = request.POST.get('orderid')
    PayinfoOrder.objects.filter(pk=orderid).update(status=2)
    return restful.ok()

③ 付费下载

如果这个用户没有购买过这个付费咨询,那么就不能下载。

Django 的 HttpResponse 对象允许将迭代器作为传入参数,将上面代码中的传入参数换成一个迭代器,便可以将下载功能优化为对大小文件均适合。

代码语言:javascript
复制
def download_payinfo(request):
    payinfo_id = request.GET.get('payinfo_id')
    payinfo = Payinfo.objects.get(pk=payinfo_id)
    buyed = PayinfoOrder.objects.filter(payinfo=payinfo, buyer=request.user, status=2)
    if not buyed:
        return redirect(reverse('payinfo:index'))
    path = payinfo.path
    # path - /20180729/xx.jpg
    # 作为一个附件的形式下载,而不是作为一个普通的文件下载
    response = FileResponse(open(os.path.join(settings.MEDIA_ROOT, path), 'rb'))
    response['Content-Type'] = 'image/jpeg'
    response['Content-Disposition'] = 'attachment; filename="%s"' % path.split('/')[-1]
    return response
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据云团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档