add some tests

This commit is contained in:
virusdefender
2016-10-30 02:17:35 +08:00
parent 078de956e5
commit 39857d1b56
118 changed files with 326 additions and 19131 deletions

View File

@@ -1,33 +1,54 @@
# coding=utf-8
import os
import hashlib
import json
import logging
import random
from django.shortcuts import render
from django.http import HttpResponse
from django.core.paginator import Paginator
from django.http import HttpResponseRedirect
from rest_framework.response import Response
from django.views.generic import View
logger = logging.getLogger("app_info")
logger = logging.getLogger(__name__)
def error_page(request, error_reason):
return render(request, "utils/error.html", {"error": error_reason})
def JSONResponse(data, content_type="application/json"):
resp = HttpResponse(json.dumps(data, indent=4), content_type=content_type)
resp.data = data
return resp
def error_response(error_reason):
return Response(data={"code": 1, "data": error_reason})
class APIView(View):
def _get_request_json(self, request):
if request.method != "GET":
body = request.body
if body:
return json.loads(body.decode("utf-8"))
return {}
return request.GET
def success(self, data=None):
return JSONResponse({"error": None, "data": data})
def serializer_invalid_response(serializer):
for k, v in serializer.errors.iteritems():
return error_response(k + " : " + v[0])
def error(self, message):
return JSONResponse({"error": "error", "data": message})
def invalid_serializer(self, serializer):
for k, v in serializer.errors.items():
return self.error(k + ": " + v[0])
def success_response(data):
return Response(data={"code": 0, "data": data})
def server_error(self):
return self.error("Server Error")
def dispatch(self, request, *args, **kwargs):
try:
request.data = self._get_request_json(self.request)
except ValueError:
return self.error("Invalid JSON")
try:
return super(APIView, self).dispatch(request, *args, **kwargs)
except Exception as e:
logging.exception(e)
return self.server_error()
def paginate_data(request, query_set, object_serializer):
@@ -41,9 +62,9 @@ def paginate_data(request, query_set, object_serializer):
}
]
如果 url 中有 paging=true 的参数,
然后还需要读取其余的两个参数page=[int],需要的页码p
age_size=[int],一页的数据条数
然后还需要读取其余的两个参数page=[int],需要的页码
page_size=[int],一页的数据条数
:param request
:param query_set 数据库查询结果
:param object_serializer: 序列化单个object的serializer
"""
@@ -97,34 +118,18 @@ def paginate_data(request, query_set, object_serializer):
return data
def paginate(request, query_set, object_serializer=None):
try:
data= paginate_data(request, query_set, object_serializer)
except Exception as e:
logger.error(str(e))
return error_response(u"参数错误")
return success_response(data)
def rand_str(length=32):
if length > 128:
raise ValueError("length must <= 128")
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
def redirect_to_login(request):
return HttpResponseRedirect("/login/?__from=" + urllib.quote(request.path))
def rand_str(length=32, type="lower_hex"):
"""
生成指定长度的随机字符串或者数字, 只用于随机编号等, 不要用于密钥等场景
:param length: 字符串或者数字的长度
:param type: str 代表随机字符串num 代表随机数字
:return: 字符串
"""
if type == "str":
return ''.join(random.choice("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") for i in range(length))
elif type == "lower_str":
return ''.join(random.choice("abcdefghijklmnopqrstuvwxyz0123456789") for i in range(length))
elif type == "lower_hex":
return ''.join(random.choice("0123456789abcdef") for i in range(length))
else:
return random.choice("123456789") + ''.join(random.choice("0123456789") for i in range(length - 1))