def get(self, request): access_key = settings.QINIU_ACCESS_KEY secret_key = settings.QINIU_SECRET_KEY q = qiniu.Auth(access_key, secret_key) bucket = settings.QINIU_BUCKET_NAME token = q.upload_token(bucket) return restful.result(data={'token': token})
def solution_list(request): ''' 需要参数有: 1. 页数(p) 2. 结果 3. 可选 1)用户 ''' page = int(request.GET.get('p', 1)) user_id = int(request.GET.get('user_id', 0)) result = int(request.GET.get('result', 11)) start = (page - 1) * settings.ONE_PAGE_SUBMISSION_COUNT end = start + settings.ONE_PAGE_SUBMISSION_COUNT if result == 11: if user_id == 0: solutions = Solution.objects.all()[start:end] else: solutions = Solution.objects.filter(user_id=user_id)[start:end] else: if user_id == 0: solutions = Solution.objects.filter(result=result)[start:end] else: solutions = Solution.objects.filter(user_id=user_id, result=result) serializer = SolutionListSerializer(solutions, many=True) data = serializer.data return restful.result(data=data)
def course_token(request): """ 生成前端视频播放所需要的token :param request: :return: token """ file = request.GET.get('video') # 这里的file是一个完整的视频链接地址 course_id = request.GET.get('course_id') exists = CourseOrder.objects.filter(course_id=course_id, buyer=request.user, status=2).exists() # 处理用户是否购买课程的逻辑 if not exists: return restful.param_error(message='请先购买该课程!') expired_time = int(time.time()) + 2 * 60 * 60 USER_ID = settings.BAIDU_CLOUD_USER_ID USER_KEY = settings.BAIDU_CLOUD_USER_KEY # 获取的file的地址url如下 # file=http://hemvpc6ui1kef2g0dd2.exp.bcevod.com/mda-igjsr8g7z7zqwnav/mda-igjsr8g7z7zqwnav.m3u8 # 1.获取地址url中的文件名的扩展名 # 2.去除扩展名,获取文件名 extension = os.path.splitext(file)[1] # 将文件名和扩展名分离: (filename, extension) media_id = file.split('/')[-1].replace(extension, '') # 获取二进制文件名: mda-igjsr8g7z7zqwnav # 将user_key编码成utf8格式 key = USER_KEY.encode('utf-8') message = '/{0}/{1}'.format(media_id, expired_time).encode('utf-8') # 数字签名 signature = hmac.new(key, message, digestmod=hashlib.sha256).hexdigest() token = '{0}_{1}_{2}'.format(signature, USER_ID, expired_time) return restful.result(data={'token': token})
def qntoken(request): access_key = settings.QINIU_ACCESS_KEY seceret_key = settings.QINIU_SECERET_KEY bucket = settings.QINIU_BUCKET_NAME q = qiniu.Auth(access_key, seceret_key) token = q.upload_token(bucket) return restful.result(data={'token': token})
def news_list(request): """ 首页新闻展示,每次点击查看更多加载2(settings中指定的数量)篇文章 :param request:新闻的页数 :return: 设置新闻的页数是通过地址栏中的查询字符串来传递 news/list/?p=1 """ page = int(request.GET.get('p', 1)) # 分类为0 表示当不进行任何筛选 默认按照时间进行排序 category_id = int(request.GET.get('category_id', 0)) start = (page - 1) * settings.ONE_PAGE_NEWS_COUNT end = start + settings.ONE_PAGE_NEWS_COUNT if category_id == 0: # 如果没有选择分类,默认是最新分类,查询展示所有分类 newses = News.objects.select_related('category', 'author').all()[start:end] else: # 查询指定分类id newses = News.objects.select_related( 'category', 'author').filter(category__id=category_id)[start:end] # 使用rest_framework框架对查询的数据进行序列化,主要对返回使用外键查询的字段 # 因为newses是查询出来的多个数据,是QuerySet对象,所以要添加many=True serializer = NewsSerializer(newses, many=True) data = serializer.data return restful.result(data=data)
def course_token(request): video_url = request.GET.get('video_url') course_id = request.GET.get('course_id') buyed = CourseOrder.objects.filter(course=course_id, buyer=request.user, status=2).exists() if not buyed: return restful.params_error(message='请先购买课程!') expiration_time = int(time.time()) + 2 * 60 * 60 USER_ID = settings.BAIDU_CLOUD_USER_ID USER_KEY = settings.BAIDU_CLOUD_USER_KEY # file=http://hemvpc6ui1kef2g0dd2.exp.bcevod.com/mda-igjsr8g7z7zqwnav/mda-igjsr8g7z7zqwnav.m3u8 extension = os.path.splitext(video_url)[1] media_id = video_url.split('/')[-1].replace(extension, '') # unicode->bytes=unicode.encode('utf-8')bytes key = USER_KEY.encode('utf-8') message = '/{0}/{1}'.format(media_id, expiration_time).encode('utf-8') signature = hmac.new(key, message, digestmod=hashlib.sha256).hexdigest() token = '{0}_{1}_{2}'.format(signature, USER_ID, expiration_time) return restful.result(data={'token': token})
def banner_list(request): # 序列化数据 banners = Banner.objects.all() serialize = BannerSerializer(banners, many=True) return restful.result(data=serialize.data)
def upload_file(request): uploadFileObj = request.FILES['myFile'] uploadFileName = "dataResource/" + uploadFileObj.name MScode = request.POST.get("types") print("MScode: " + MScode) print(uploadFileName) with open(uploadFileName, 'wb') as saveFile: for chunk in uploadFileObj.chunks(): saveFile.write(chunk) f = open(uploadFileName, encoding='utf-8') data_json = json.load(f) code = 0 sequenceNum = [] data = xlrd.open_workbook('shandongdata.xlsx', encoding_override='utf-8') # 读取表 for dataj in data_json: DisasterType, sqNumber = TransData( dataj["Code"]) # 解码ID,返回后七位的灾情信息码中的大类代码和子类代码 code = DisasterType sequenceNum.append(sqNumber) dataj["ReportingUnit"] = MScode + "-" + dataj[ "ReportingUnit"] # 将编码MSCode加在reportingunit字段中 disInfo = dataj["Code"] # 获取19位编码 dataj["Location"] = TransDataAddress( data, disInfo[0:12] ) # 获取19位ID的前十二位编码,即基础地理信息码 # 获取19位ID的前十二位编码,即基础地理信息码 print("DisasterType:" + DisasterType) print("data:" + str(dataj)) databaseOperation(code, data_json, sequenceNum) print('ok') return restful.result(message="upload success", data={ "MScode": MScode, "uploadFileName": uploadFileObj.name })
def shoppingcart_list(request): name = request.GET.get('name') price = request.GET.get('price') product_item = Products.objects.filter(name=name, price=price) serializer = ProductsSerializer(product_item) data = serializer.data return restful.result(data=data)
def save_contract(request): form = ContractForm(request.POST) # print(request.POST.get('signature')) img = request.POST.get('signature').split('base64,')[1] print(img) img = base64.b64decode(img) file = open('media/test.png', 'wb') file.write(img) file.close() url = upload_image(file.name) print(url) re = requests.post( 'http://localhost:8888/deploy?account=0xc01c805b559f4f71e1cec542c342ec7482b22cd1&password=123' ) id = re.text if form.is_valid(): print('表单检验成功') title = form.cleaned_data.get('title') content = request.POST.get('content') print(title) print(content) contract = Contract.objects.create(uid=id, title=title, content=content, signatureUrl_one=url) print(str(contract)) return restful.result(data=contract.pk) else: return restful.params_error(message=form.errors)
def news_list_view(request): page = int(request.GET.get('p', 1)) start = int((page - 1) * settings.ONE_PAGE_NEWS_COUNT) end = int(start + settings.ONE_PAGE_NEWS_COUNT) newses = News.objects.select_related('category', 'author').all()[start:end] serializer = NewsListSerializer(newses, many=True) return restful.result(data=serializer.data)
def news_list(request): username = request.session.get('user_name', '') parm = request.POST.get('parm') if not username: return redirect('/auth/login/') else: page = int(request.POST.get('page', 1)) # str - 1 初始值为2 # limit 从第几条数据开始 要取几条 # 一页只有1条 # 0-1 1-2 # 开始位置 结束位置 0 + (0+1) page+1 page=2 1 - (1+1=2 ) 2 - 3 # page_start = settings.ONE_PAGE_NEWS_COUNT * (page - 1) # page_end = page_start + settings.ONE_PAGE_NEWS_COUNT # 如果是全部显示 if parm == 'all': page_start = settings.ONE_PAGE_NEWS_COUNT * (page - 1) page_end = page_start + settings.ONE_PAGE_NEWS_COUNT newses = News.objects.all()[page_start:page_end] # 只显示我的文章 elif parm == 'me': page_start = settings.ONE_PAGE_NEWS_COUNT * (page - 1) page_end = page_start + settings.ONE_PAGE_NEWS_COUNT newses = News.objects.filter( author_id=request.session.get('user_id'))[page_start:page_end] # 在搜索结果中显示 else: page_start = settings.ONE_PAGE_NEWS_COUNT * (page - 1) page_end = page_start + settings.ONE_PAGE_NEWS_COUNT newses = newses = News.objects.filter( Q(title__contains=parm) | Q(content__icontains=parm) | Q(author__username__icontains=parm))[page_start:page_end] # 要同时序列化多条 serializer = NewsSerializer(newses, many=True) return restful.result(data={"newses": serializer.data})
def news_list(request): # 通过p参数,来指定要获取第几页的数据 # 并且这个p参数,是通过查询字符串的方式传过来的/news/list/?p=2 # 如果没有url中没有给p参数,那默认返回第1页数据(且要变成整型,否则是字符串类型,那就不能做相加) page = int(request.GET.get('p', 1)) # 分类为0:代表不进行任何分类,直接按照时间倒序排序 category_id = int(request.GET.get('category_id', 0)) # 点击加载更多按钮时要加载起始新闻和结束新闻 # 0,1 # 2,3 # 4,5 start = (page - 1) * settings.ONE_PAGE_NEWS_COUNT end = start + settings.ONE_PAGE_NEWS_COUNT # 如果category_id为0(即没有指定分类),就加载全部分类内容,否则只加载category_id所对应的分类内容 if category_id == 0: # 这里不能通过value()来获取,它会得到一个列表,列表里面是字典,但是这个字典有很大的缺陷, # 比如我们想获取的新式如下(把category下所有信息获取到,1但是value()只是获取category下的id) # {'id':1,'title':'abc',category:{"id":1,'name':'热点'}} # 那这时候我们就要用到一个插件:django rest framework(如里面的序列化就可以将一个模型序列化成json形式的字符串, # 可以告诉它哪些字段要序列化,并且如category,不仅仅获取id还要获取其它信息(如name)) newses = News.objects.select_related('category', 'author').all()[start:end] else: newses = News.objects.select_related( 'category', 'author').filter(category__id=category_id)[start:end] # 创建一个序列化,把newses传进去,由于newses中有很多新闻数据(queryset对象),所以要传many=True(表示有很多新闻数据都要去序列化) serializer = NewsSerializer(newses, many=True) # 拿到序列化后就可以通过erializer.data拿到序列化里的值 data = serializer.data return restful.result(data=data)
def news_list(request): # 通过p参数,来指定要获取第几页的数据 # 并且这个p参数,是通过查询字符串的方式传过来的/news/list/?p=2 page = int(request.GET.get('p', 1)) # 分类为0:代表提取所有新闻 category_id = int(request.GET.get('category_id', 0)) # 0,1 # 2,3 start = (page - 1) * settings.ONE_PAGE_NEWS_COUNT end = start + settings.ONE_PAGE_NEWS_COUNT if category_id == 0: # values()方法可以获取到字典,但是只能获取到外键的id,不能获取到分类和作者中的字段 newses = News.objects.select_related('category', 'author').all()[start:end] else: newses = News.objects.select_related( 'category', 'author').filter(category__pk=category_id)[start:end] # 当字段是主键可以不写,直接写成下面这样 # newses = News.objects.filter(category=category_id) # 我们可以用djangorestframework的序列化来解决这个问题,跟使用表单十分类似,many代表要序列多个值,因为newses中有多个值故设置成True serializer = NewsSerializer(newses, many=True) # 获取序列化后的数据 data = serializer.data # print(type(data), data) # 使用json进行传输 return restful.result(data=data)
def qntoken(request): access_key = 'SXJAGOM6nPxMAInwr3y5yy8cuGdQeIHIKsyMsvqt' secret_key = 'uoYTDGLeAbrzEcQRhuRyYhB_In8RF2ageTqE7QK4' q = qiniu.Auth(access_key, secret_key) bucket = 'dubbs' token = q.upload_token(bucket) return restful.result(data={'token': token})
def course_token(request): # 视频的 url file = request.GET.get("video") course_id = request.GET.get("course_id") if not CourseOrder.objects.filter( course_id=course_id, buyer=request.user, status=2).exists(): return restful.params_error(message='请先购买课程! ') # token的过期时间 为两个小时 expiration_time = int(time.time()) + 2 * 60 * 60 USER_ID = settings.BAIDU_CLOUD_USER_ID USER_KEY = settings.BAIDU_CLOUD_USER_KEY # file = http://jmvi6gv2zgxb65v5f2r.exp.bcevod.com/mda-jmvih7nruwyfr5vv/mda-jmvih7nruwyfr5vv.m3u8 # os.path.splitext 将url分为['http://jmvi6gv2zgxb65v5f2r.exp.bcevod.com/mda-jmvih7nruwyfr5vv/mda-jmvih7nruwyfr5vv','.m3u8'] extension = os.path.splitext(file)[1] # 最终获得视频的media_id media_id = file.split('/')[-1].replace(extension, '') # 因为USER_KEY被加密生成signature 所以需要encode key = USER_KEY.encode('utf-8') message = '/{0}/{1}'.format(media_id, expiration_time).encode('utf-8') signature = hmac.new(key, message, digestmod=hashlib.sha256).hexdigest() token = '{0}_{1}_{2}'.format(signature, USER_ID, expiration_time) return restful.result(data={'token': token})
def news_list(request): # 通过 p 参数,来指定获取的是第几页的数据 # 并且,这个p参数,是通过查询字符串的方式,传过来的 # 默认返回第一页的数据 page = int(request.GET.get('p', 1)) # 分类为0,表示不进行任何分类,直接按照时间倒序排序 category_id = int(request.GET.get('category_id', 0)) # 第一页,0,1 # 第一页,2,3 start = (page - 1) * settings.ONE_PAGE_NEWS_COUNT end = start + settings.ONE_PAGE_NEWS_COUNT if category_id == 0: # QuerySet对象,调用values(),得到列表,列表里面是字典 # 这个不符合要求,有缺陷 newses = News.objects.select_related('category', 'author').all()[start:end] else: newses = News.objects.select_related( 'category', 'author').filter(category_id=category_id)[start:end] serializer = NewsSerializer(newses, many=True) data = serializer.data print(data) # 将数据,返回给用户 return restful.result(data=data)
def news_list(request): """ 获取新闻列表, 并将新闻列表返回json格式 :param request: :return: """ # news/list/?p=3 # 这里的1 为默认参数 page = int(request.GET.get('p', 1)) category_id = int(request.GET.get('category_id', 0)) start = settings.ONE_PAGE_NEWS_COUNT * (page - 1) end = start + settings.ONE_PAGE_NEWS_COUNT # news: queryset -> [News():news()] # news_list = list(News.objects.all()[start:end].values()) # values 可以将queryset转换为一个字典 # print(category_id) if category_id == 0: # 如果category_id = 0 说明没有传category_id 过来 newses = News.objects.all()[start:end] else: newses = News.objects.filter(category_id=category_id)[start:end] # 用序列化引转化成需要的json格式 serizlizer = NewsSerializer(newses, many=True) return restful.result(data=serizlizer.data)
def login_view(request): #创建表单实例 form = LoginForm(request.POST) #验证表单信息,并且获取表单内容 if form.is_valid(): telephone = form.cleaned_data.get('telephone') password = form.cleaned_data.get('password') remember = form.cleaned_data.get('remember') #使用django自带authenticate方法,验证登录,正确返回user对象,不正确返回None user = authenticate(request, username=telephone, password=password) #登录成功后继续执行 if user: #判断是否进入黑名单 if user.is_active: #使用login方法保持会话状态 login(request, user) #如果用户选择记住密码,设置过期时间为默认的两周,否则浏览器关闭即过期 if remember: request.session.set_expiry(None) else: request.session.set_expiry(0) #登录返回json数据,登录成功返回200,使用通用格式 return restful.result() else: #如果是黑名单,则返回405 表示没有权限,或者是其他错误 return restful.unauth(message="没有权限") else: #验证失败,登录信息错误 return restful.params_error(message="手机号或者密码错误!") else: #表单验证错误 errors = form.get_errors() return restful.params_error(message=errors)
def thumbnail_process(request): access_key = 'L7Idi7_0oH-8LC1g2CjLb1h9Z6kN4-JLoqoOn21U' secret_key = 'IGhDFYcbCns_3RcEopOwmHLE8M7XctIe_bVwYfHr' bucket = 'establish' q = qiniuAuth(access_key, secret_key) token = q.upload_token(bucket) return restful.result(data={'token': token})
def get(self, request): category_id = request.GET.get('pk') courses = Course.objects.select_related( 'category', 'teacher').filter(category_id=category_id) serializers = CourseSerializers(courses, many=True) data = serializers.data return restful.result(data=data)
def delete_rank(request): pk = request.POST.get('pk') try: Rank.objects.filter(pk=pk).delete() return restful.result(message='删除成功') except: return restful.params_error(message='删除排行失败,排行不存在')
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') price = request.POST.get('price') return_url = request.POST.get('return_url') token = settings.PAY_TOKEN uid = settings.PAY_UID orderuid = str(request.user.pk) key = md5( (goodsname + istype + notify_url + orderid + orderuid + price + return_url + token + uid).encode("utf-8")).hexdigest() # key = md5 ("".join ([goodsname, istype, notify_url, orderuid, orderuid, price, return_url, token, uid]) # .encode ("utf-8")).hexdigest () return restful.result(data={'key': key})
def course_token(request): """ 百度点播的token """ course_id = request.GET.get('course_id') course = Course.objects.get(id=course_id) order = CourseOrder.objects.filter(course=course, statuse=2).exists() if not order: return restful.params_error('购买了吗') video_url = request.GET.get('video_url') # 过期时间 expiration_time = int(time.time()) + 2 * 60 * 60 USER_ID = settings.BAIDU_CLOUD_USER_ID USER_KEY = settings.BAIDU_CLOUD_USER_KEY # file=http://hemvpc6ui1kef2g0dd2.exp.bcevod.com/mda-igjsr8g7z7zqwnav/mda-igjsr8g7z7zqwnav.m3u8 extension = os.path.splitext(video_url)[1] # .m3u8 # 'mda-igjsr8g7z7zqwnav.m3u8'.replace('.m3u8', '') = 'mda-igjsr8g7z7zqwnav' media_id = video_url.split('/')[-1].replace(extension, '') # unicode->bytes=unicode.encode('utf-8')bytes key = USER_KEY.encode('utf-8') message = '/{0}/{1}'.format(media_id, expiration_time).encode('utf-8') signature = hmac.new(key, message, digestmod=hashlib.sha256).hexdigest() token = '{0}_{1}_{2}'.format(signature, USER_ID, expiration_time) print('token:', token) # a5e28c640e8436d9d0b7800116d1d59fc358229e8e448c5bb43d88fcdb114f83_92166a15820c4d2eb7798a57ee8230d2_1533032256 return restful.result(data={'token': token})
def course_token(request): # video:是视频文件的完整链接 file = request.GET.get('video') # 判断用户是否已购买; course_id = request.GET.get('course_id') if not CourseOrder.objects.filter( course_id=course_id, buyer=request.user, status=2).exists(): return restful.params_error(message="请先购买课程!") # 过期时间2小时;(当前时间戳+两个小时); expiration_time = int(time.time()) + 2 * 60 * 60 USER_ID = settings.BAIDU_CLOUD_USER_ID USER_KEY = settings.BAIDU_CLOUD_USER_KEY # file=http://hemvpc6ui1kef2g0dd2.exp.bcevod.com/mda-igjsr8g7z7zqwnav/mda-igjsr8g7z7zqwnav.m3u8 # 先获取扩展名;再通过‘/’分割取最后一个值,并将扩展名替换为空字符串;得到‘ID’; extension = os.path.splitext(file)[1] media_id = file.split('/')[-1].replace(extension, '') # 将‘USER_KEY’进行编码;后面的‘hmac.new()’只能接受bytes类型; # unicode->bytes=unicode.encode('utf-8')bytes key = USER_KEY.encode('utf-8') message = '/{0}/{1}'.format(media_id, expiration_time).encode('utf-8') # signature:生成签名; # disgestmod:指定加密方式; signature = hmac.new(key, message, digestmod=hashlib.sha256).hexdigest() # 利用下划线(_)连接signature,userId,expirationTime组合成token = String.format(“ % s_ % s_ % s”, signature, userId,expirationTime) token = '{0}_{1}_{2}'.format(signature, USER_ID, expiration_time) return restful.result(data={'token': token})