Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。
确认订单,课程购买状态查询,付费下载;确认订单需要 POST 请求后端传入商品名称、支付方式、订单号、价格,然后对接收的值进行 MD5 加密。
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()。
① 确认订单
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 中设置了全局中间件。
@csrf_exempt
def notify_view(request):
orderid = request.POST.get('orderid')
PayinfoOrder.objects.filter(pk=orderid).update(status=2)
return restful.ok()
③ 付费下载
如果这个用户没有购买过这个付费咨询,那么就不能下载。
Django 的 HttpResponse 对象允许将迭代器作为传入参数,将上面代码中的传入参数换成一个迭代器,便可以将下载功能优化为对大小文件均适合。
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