123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 |
- #coding=utf-8
- '''
- '''
- import json
- import logging
- import re
- import traceback
- import datetime
- import hashlib
- from utils.aestool import aescbc
- import decimal
- import uuid
- from django import http
- from django.contrib.sessions.backends.cache import SessionStore
- from django.core.cache import cache
- from django.http import HttpResponse, JsonResponse
- from django.shortcuts import render
- from django.utils.decorators import method_decorator
- from django.views import View
- from django.views.decorators.csrf import csrf_exempt
- from django.core.serializers.json import DjangoJSONEncoder
- from common import error_info
- from common.models import UserInfo
- import common.models as cm
- import common.error_info as ce
- logger = logging.getLogger(__name__)
- class CusDjangoJSONEncoder(json.JSONEncoder):
- """
- JSONEncoder subclass that knows how to encode date/time, decimal types and UUIDs.
- """
- def default(self, o):
- # See "Date Time String Format" in the ECMA-262 specification.
- if isinstance(o, datetime.datetime):
- r = datetime.datetime.strftime(o,'%Y-%m-%d %H:%M:%S')
- return r
- elif isinstance(o, datetime.date):
- return o.isoformat()
- elif isinstance(o, datetime.time):
- if is_aware(o):
- raise ValueError("JSON can't represent timezone-aware times.")
- r = o.isoformat()
- if o.microsecond:
- r = r[:12]
- return r
- elif isinstance(o, datetime.timedelta):
- return duration_iso_string(o)
- elif isinstance(o, decimal.Decimal):
- return str(o)
- elif isinstance(o, uuid.UUID):
- return str(o)
- else:
- return super(DjangoJSONEncoder, self).default(o)
- class AuthView(View):
- @method_decorator(csrf_exempt)
- def dispatch(self, request, *args, **kwargs):
- """
- @attention: as_view()方法使用该方法来分发不同http method,添加异常处理及登陆校验
- """
- if request.method.lower() in self.http_method_names:
- handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
- else:
- handler = self.http_method_not_allowed
- return api_wapper(handler, request, True, *args, **kwargs)
- class AdminView(View):
- @method_decorator(csrf_exempt)
- def dispatch(self, request, *args, **kwargs):
- """
- @attention: as_view()方法使用该方法来分发不同http method,添加异常处理及登陆校验
- """
- self.http_method_names.append("options")
- if request.method.lower() in self.http_method_names:
- handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
- else:
- handler = self.http_method_not_allowed
- return admin_handler(handler, request, True, *args, **kwargs)
- class BaseView(View):
- @method_decorator(csrf_exempt)
- def dispatch(self, request, *args, **kwargs):
- """
- @attention: as_view()方法使用该方法来分发不同http method,添加异常处理及登陆校验
- """
- if request.method.lower() in self.http_method_names:
- handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
- else:
- handler = self.http_method_not_allowed
- return api_wapper(handler, request, False, *args, **kwargs)
- def api_wapper(handler, request, is_vauth, *args, **kwargs):
- """
- @attention: 调试API时使用的装饰器
- """
- req_path = request.META["PATH_INFO"]
- ip = request.META.get("HTTP_X_REAL_IP","")
- token = request.META.get("HTTP_AUTHORIZATION")
- if is_vauth:
- if token:
- dec_name = aescbc.decrypt(token)
- id = dec_name.split("_")[0]
- #id = 80
- user = cm.UserInfo.objects.filter(id=id).first()
- if not user and False:
- return JsonResponse({"code":403,"data":{}})
- #选手
- cur_match_id = cm.Player.objects.filter(user_id=id).order_by("-match_id").first().match_id
- player = cm.Player.objects.filter(user_id=id,match_id=cur_match_id).order_by("-id").first()
- setattr(request, "ip", get_ip(request))
- setattr(request, "user", user)
- setattr(request, "player", player)
- if request.method == "OPTIONS":
- return JsonResponse({})
- else:
- return JsonResponse({"code":403,"data":{}})
- body = request.body if hasattr(request, "body") else ""
- if "x-www-form-urlencoded" in request.content_type:
- info = http.QueryDict(body).dict()
- if not info:
- info = request.GET.dict()
- elif "application/json" in request.content_type:
- info = json.loads(body) if body else {}
- if not info:
- info = request.GET.dict()
- else:
- try:
- info = json.loads(body) if body else {}
- if not info:
- info = request.GET.dict()
- except Exception as e:
- info = {}
- setattr(request, "json", info)
- try:
- ret = handler(request, *args, **kwargs)
- return ret
- except Exception as e:
- return to_fail(e)
- def admin_handler(handler, request, is_vauth, *args, **kwargs):
- """
- 登录session校验
- """
- req_path = request.META["PATH_INFO"]
- ip = request.META.get("HTTP_X_REAL_IP","")
- token = request.META.get("HTTP_AUTHORIZATION")
- if is_vauth and not request.user.is_authenticated():
- return HttpResponse(status=403)
- body = request.body if hasattr(request, "body") else ""
- if "x-www-form-urlencoded" in request.content_type:
- info = http.QueryDict(body).dict()
- if not info:
- info = request.GET.dict()
- elif "application/json" in request.content_type:
- info = json.loads(body) if body else {}
- if not info:
- info = request.GET.dict()
- else:
- try:
- info = json.loads(body) if body else {}
- if not info:
- info = request.GET.dict()
- except:
- info = {}
- setattr(request, "json", info)
- setattr(request, "ip", get_ip(request))
- try:
- ret = handler(request, *args, **kwargs)
- return ret
- except Exception as e:
- return to_fail(e)
- def to_suc(data={}):
- info = {}
- info["data"] = data
- info["code"] = 0
- return JsonResponse(info,encoder=CusDjangoJSONEncoder)
- def to_fail(e=None):
- info = {}
- info["code"] = 1000
- if isinstance(e,ce.TipException):
- info["message"] = e.msg
- else:
- info["message"] = str(e)
- return JsonResponse(info)
- def tracefail():
- traceback.print_exc()
- def stream_file(content, content_type, file_name):
- """
- 输出文件
- :param content: 内容 StringIO 类型
- :param content_type: 类型 eg: "application/vnd.ms-excel"
- :param file_name: 文件名(需指定后缀)
- """
- response = HttpResponse(content=content, content_type=content_type)
- response['Content-Disposition'] = 'attachment; filename={}'.format(file_name)
- return response
- def get_ip(request):
- if request.META.has_key('HTTP_X_REAL_IP'):
- ip = request.META['HTTP_X_REAL_IP']
- elif request.META.has_key('HTTP_X_FORWARDED_FOR'):
- ip = request.META['HTTP_X_FORWARDED_FOR']
- else:
- ip = request.META['REMOTE_ADDR']
- return ip
|