2015-06-26 07:59:53 +00:00
|
|
|
|
# coding=utf-8
|
2016-03-28 09:46:56 +00:00
|
|
|
|
import os
|
2015-08-10 04:25:35 +00:00
|
|
|
|
import hashlib
|
|
|
|
|
import time
|
|
|
|
|
import random
|
2015-12-22 16:31:43 +00:00
|
|
|
|
import logging
|
2015-08-10 04:25:35 +00:00
|
|
|
|
|
2015-08-14 02:22:32 +00:00
|
|
|
|
from django.shortcuts import render
|
2015-08-05 00:44:28 +00:00
|
|
|
|
from django.core.paginator import Paginator
|
|
|
|
|
|
2015-06-29 04:43:17 +00:00
|
|
|
|
from rest_framework.response import Response
|
|
|
|
|
|
|
|
|
|
|
2015-12-22 16:31:43 +00:00
|
|
|
|
logger = logging.getLogger("app_info")
|
|
|
|
|
|
|
|
|
|
|
2015-08-14 02:22:32 +00:00
|
|
|
|
def error_page(request, error_reason):
|
|
|
|
|
return render(request, "utils/error.html", {"error": error_reason})
|
|
|
|
|
|
|
|
|
|
|
2015-06-29 04:43:17 +00:00
|
|
|
|
def error_response(error_reason):
|
|
|
|
|
return Response(data={"code": 1, "data": error_reason})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def serializer_invalid_response(serializer):
|
2015-08-14 02:22:32 +00:00
|
|
|
|
for k, v in serializer.errors.iteritems():
|
|
|
|
|
return error_response(k + " : " + v[0])
|
2015-06-29 04:43:17 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def success_response(data):
|
2015-08-05 00:44:28 +00:00
|
|
|
|
return Response(data={"code": 0, "data": data})
|
|
|
|
|
|
|
|
|
|
|
2015-10-08 06:03:50 +00:00
|
|
|
|
def paginate_data(request, query_set, object_serializer):
|
2015-08-05 00:44:28 +00:00
|
|
|
|
"""
|
|
|
|
|
用于分页的函数
|
2015-08-05 00:53:39 +00:00
|
|
|
|
如果 url 里面不含有paging=true,那么将返回全部数据。类似
|
|
|
|
|
[
|
|
|
|
|
{
|
|
|
|
|
"username": "1111111",
|
|
|
|
|
"password": "123456"
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
如果 url 中有 paging=true 的参数,
|
|
|
|
|
然后还需要读取其余的两个参数,page=[int],需要的页码,p
|
|
|
|
|
age_size=[int],一页的数据条数
|
2015-10-08 06:03:50 +00:00
|
|
|
|
|
2015-08-05 00:44:28 +00:00
|
|
|
|
:param query_set 数据库查询结果
|
|
|
|
|
:param object_serializer: 序列化单个object的serializer
|
|
|
|
|
"""
|
|
|
|
|
need_paginate = request.GET.get("paging", None)
|
|
|
|
|
# 如果请求的参数里面没有paging=true的话 就返回全部数据
|
|
|
|
|
if need_paginate != "true":
|
2015-10-08 06:03:50 +00:00
|
|
|
|
if object_serializer:
|
|
|
|
|
return object_serializer(query_set, many=True).data
|
|
|
|
|
else:
|
|
|
|
|
return query_set
|
2015-08-05 00:44:28 +00:00
|
|
|
|
|
|
|
|
|
page_size = request.GET.get("page_size", None)
|
|
|
|
|
if not page_size:
|
2015-10-08 06:03:50 +00:00
|
|
|
|
raise ValueError("Error parameter page_size")
|
2015-08-05 00:44:28 +00:00
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
page_size = int(page_size)
|
|
|
|
|
except Exception:
|
2015-10-08 06:03:50 +00:00
|
|
|
|
raise ValueError("Error parameter page_size")
|
2015-08-05 00:44:28 +00:00
|
|
|
|
|
|
|
|
|
paginator = Paginator(query_set, page_size)
|
|
|
|
|
page = request.GET.get("page", None)
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
current_page = paginator.page(page)
|
|
|
|
|
except Exception:
|
2015-10-08 06:03:50 +00:00
|
|
|
|
raise ValueError("Error parameter current_page")
|
|
|
|
|
if object_serializer:
|
|
|
|
|
results = object_serializer(current_page, many=True).data
|
|
|
|
|
else:
|
|
|
|
|
results = current_page
|
2015-08-05 00:44:28 +00:00
|
|
|
|
|
2015-10-08 06:03:50 +00:00
|
|
|
|
data = {"results": results,
|
2015-08-08 00:41:20 +00:00
|
|
|
|
"previous_page": None,
|
|
|
|
|
"next_page": None,
|
2015-10-08 06:03:50 +00:00
|
|
|
|
"page_size": page_size,
|
|
|
|
|
"current_page": page,
|
2015-08-08 00:41:20 +00:00
|
|
|
|
"count": paginator.count,
|
|
|
|
|
"total_page": paginator.num_pages}
|
2015-08-05 00:44:28 +00:00
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
data["previous_page"] = current_page.previous_page_number()
|
|
|
|
|
except Exception:
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
data["next_page"] = current_page.next_page_number()
|
|
|
|
|
except Exception:
|
|
|
|
|
pass
|
|
|
|
|
|
2015-10-08 06:03:50 +00:00
|
|
|
|
return data
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def paginate(request, query_set, object_serializer=None):
|
|
|
|
|
try:
|
|
|
|
|
data= paginate_data(request, query_set, object_serializer)
|
2015-12-22 16:31:43 +00:00
|
|
|
|
except Exception as e:
|
|
|
|
|
logger.error(str(e))
|
2015-10-08 06:03:50 +00:00
|
|
|
|
return error_response(u"参数错误")
|
2015-08-08 00:41:20 +00:00
|
|
|
|
return success_response(data)
|
2015-08-10 04:25:35 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def rand_str(length=32):
|
2016-03-28 09:46:56 +00:00
|
|
|
|
if length > 128:
|
|
|
|
|
raise ValueError("length must <= 128")
|
2016-05-30 06:35:16 +00:00
|
|
|
|
return hashlib.sha512(os.urandom(128)).hexdigest()[0:length]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def build_query_string(kv_data, ignore_none=True):
|
|
|
|
|
# {"a": 1, "b": "test"} -> "?a=1&b=test"
|
|
|
|
|
query_string = ""
|
|
|
|
|
for k, v in kv_data.iteritems():
|
|
|
|
|
if ignore_none is True and kv_data[k] is None:
|
|
|
|
|
continue
|
|
|
|
|
if query_string != "":
|
|
|
|
|
query_string += "&"
|
|
|
|
|
else:
|
|
|
|
|
query_string = "?"
|
|
|
|
|
query_string += (k + "=" + str(v))
|
|
|
|
|
return query_string
|