Exemplo n.º 1
0
def get_access_token_from_wx():
    """从微信服务器获取 access_token """
    params = {
        "grant_type": "client_credential",
        "appid": current_app.config['APP_ID'],
        "secret": current_app.config['APP_SECRET']
    }
    base_url = current_app.config['GET_TOKEN_BASE_URL']

    index = 1
    while True:
        # 防止死循环
        index += 1
        if index > 5:
            raise ServerError(msg='get wx access_token timeout')
        try:
            response = requests.post(base_url, params).json()
            access_token = response.get('access_token')
            if access_token:
                # 将 token 存入暂存数据表
                expires_at = int(response.get('expires_in')) + int(
                    datetime.now().timestamp())
                set_value_by_key(key='wx_access_token',
                                 value=access_token,
                                 expires_at=expires_at,
                                 des='微信小程序 access_token')
                return access_token
            elif response.get('errcode') == -1:
                # -1 代表微信服务器繁忙
                pass
            else:
                raise ServerError()
        except Exception:
            raise ServerError()
Exemplo n.º 2
0
 def default_error_handler(error):
     """
     默认异常处理
     :param error:
     :return:
     """
     app.logger.fatal(traceback.format_exc())
     error = ServerError()
     return error.as_response()
Exemplo n.º 3
0
def __login_by_mina(code):
    openid = MemberService.get_wechat_openid(code)
    if openid is None:
        raise ServerError(msg='调用微信出错', error_code=2001)

    bind_info = check_member_bind(openid, 1)
    if not bind_info:
        req = request.json
        nickname = req['nickName'] if 'nickName' in req else ''
        sex = req['gender'] if 'gender' in req else 0
        avatar = req['avatarUrl'] if 'avatarUrl' in req else ''

        model_member = Member()
        model_member.nickname = nickname
        model_member.sex = sex
        model_member.avatar = avatar
        model_member.salt = MemberService.gene_salt()
        model_member.updated_time = model_member.created_time = get_current_date(
        )
        with db.auto_commit():
            db.session.add(model_member)
        with db.auto_commit():
            model_bind = MemberAuthBind()
            model_bind.member_id = model_member.id
            model_bind.type = ClientTypeEnum.USER_MINA.value
            model_bind.openid = openid
            model_bind.extra = ''
            model_bind.updated_time = model_bind.created_time = get_current_date(
            )
            db.session.add(model_bind)

        bind_info = model_member

    member_info = Member.query.filter_by(id=bind_info.id).first()
    return member_info
Exemplo n.º 4
0
 def default(self, o):
     """default 是可以递归调用的"""
     if hasattr(o, 'keys') and hasattr(o, '__getitem__'):
         return dict(o)
     if isinstance(o, date):
         return o.strftime('%Y-%m-%d')
     raise ServerError()
Exemplo n.º 5
0
 def default(self, o):
     if hasattr(o, 'keys') and hasattr(o, '__getitem__'):
         #当一个对象有keys和__gettiem__方法 它的属性可以被 obj['名字'] 这样调用
         return dict(o)
     if isinstance(o, date):
         return o.strftime('%Y-%m-%d')
     raise ServerError()
Exemplo n.º 6
0
 def default(self, o):
     if hasattr(o, 'keys') and hasattr(o, '__getitem__'):
         return dict(o)
     # 兼容其他的序列化
     if isinstance(o, date):
         return o.strftime('%Y-%m-%d')
     raise ServerError()
Exemplo n.º 7
0
def store_performance(data):
    with db.auto_commit():
        performance = MicroPerformance()
        try:
            [setattr(performance, key, data[key]) for key in data.keys()]
            db.session.add(performance)
        except Exception as e:
            raise ServerError(e)
Exemplo n.º 8
0
 def default(self, o):
     try:
         val = super(JSONEncoder, self).default(o)
         return val
     except:
         if hasattr(o, 'keys') and hasattr(o, '__getitem__'):
             return dict(o)
     raise ServerError()
Exemplo n.º 9
0
 def default(self, o):
     # 容错:客户端不能解决的问题就不要用
     if hasattr(o, 'keys') and hasattr(o, '__getitem__'):
         return dict(o)
     # 遇到不能序列化的会递归调用,需要考虑时间
     if isinstance(o, date):
         return o.strftime('%Y-%m-%d')
     raise ServerError()
Exemplo n.º 10
0
def article_api():
    form = ArticleForm(request)
    try:
        if form.validate_for_api():
            urllist = api_urllist(form)
            return send_url_etcd(urllist, form)
    except:
        return ServerError(msg="服务端错误,请联系技术人员处理")
Exemplo n.º 11
0
def framework(e):
    if isinstance(e, APIException):
        return e
    elif isinstance(e, HTTPException):
        return APIException(e.description, e.code, 1007)
    elif current_app.config['DEBUG']:
        raise e
    return ServerError()
Exemplo n.º 12
0
 def default(self, o):
     if hasattr(o, 'keys') and hasattr(o, '__getitem__'):
         d = dict(o)
         d = {**d, 'err_code': 0, 'msg': ''}
         return d
     if isinstance(o, date):
         return o.strftime('%Y-%m-%d')
     raise ServerError()
Exemplo n.º 13
0
 def default(self, o):
     # 将sqlalchemy对象返回为字典格式
     if hasattr(o, 'keys') and hasattr(o, '__getitem__'):
         return dict(o)
     if isinstance(o, date):
         return o.strftime('%Y-%m-%d')
     if isinstance(o, datetime):
         return o.strftime('%Y-%m-%d %H:%M:%S')
     raise ServerError()
Exemplo n.º 14
0
 def default(self, o):
     if hasattr(o, 'keys') and hasattr(o, '__getitem__'):
         return dict(o)
     # python不能序列化的对象要特殊处理
     if isinstance(o, date):
         return o.strftime('%Y-%m-%d')
     if isinstance(o, Decimal):
         return o.__float__()
     raise ServerError()
Exemplo n.º 15
0
 def default(self, o):
     if hasattr(o, 'keys') and hasattr(o, '__getitem__'):
         return dict(o)
     if isinstance(o, date):
         return o.strftime('%Y-%m-%d')
     # 定义decimal类型的序列化方法
     if isinstance(o, decimal.Decimal):
         return "%.2f" % o
     raise ServerError()
Exemplo n.º 16
0
    def default(self, o):
        # default 递归调用
        if hasattr(o, "keys") and hasattr(o, "__getitem__"):
            return dict(o)

        if isinstance(o, date):
            return o.strftime("%Y-%m-%d")

        raise ServerError()
Exemplo n.º 17
0
 def default(self, o: Any):
     if hasattr(o, 'serialize'):
         return o.serialize()
     if hasattr(o, 'keys') and hasattr(o, '__getitem__'):
         return dict(o)
     if isinstance(o, UserTypeEnum):
         return o.user_str(o)
     if isinstance(o, date):
         return o.isoformat()
     raise ServerError()
Exemplo n.º 18
0
def get_openId(code):
        result = requests.get(current_app.config['LOGINURL'].format(
            current_app.config['APPID'],
            current_app.config['APPSECRET'],
            code
        ))
        print(json.loads(result.text)["openid"])
        if not result:
            raise ServerError("微信内部错误")
        return {"openId": json.loads(result.text)["openid"]}
Exemplo n.º 19
0
 def default(self, o):
     if hasattr(o, 'keys') and hasattr(o, '__getitem__'):
         return dict(o)
     if isinstance(o, date):
         return o.strftime('%Y-%m-%d')
     if hasattr(o, '__dict__'):
         return o.__dict__
     if isinstance(o, Decimal):
         return str(o.quantize(Decimal('0.00')))
     raise ServerError()
Exemplo n.º 20
0
    def default(self, o):
        if hasattr(o, 'keys') and hasattr(o, '__getitem__'):
            return dict(o)
        #如果对象里面,有属性是时间对象,另外处理
        if isinstance(o, datetime):
            return o.strftime('%Y-%m-%d %H:%M:%S')
        if isinstance(o, date):
            return o.strftime('%Y-%m-%d')

        raise ServerError()  # 具体的错误信息反馈到客户端,也没用,返回一个统一的
Exemplo n.º 21
0
 def framework_error(e):
     if isinstance(e, APIException):
         return e
     elif isinstance(e, HTTPException):
         return APIException(code=e.code, error_code=1007, msg=e.description)
     else:
         if not app.config['DEBUG']:
             return ServerError()  # 未知错误(统一为服务端异常)
         else:
             raise e
Exemplo n.º 22
0
def framework_error(e):
    #flask 1.0
    #APIException
    #HTTPException
    #Exception
    if isinstance(e,APIException):
        return e
    if isinstance(e,HTTPException):
        code = e.code
        msg = e.description
        error_code = 1007
        return APIException(msg, code, error_code)
    else:
        #log
        if not app.config('DEBUG'):
            return ServerError()
        else:
            raise e
        return ServerError()
Exemplo n.º 23
0
def framework_errpr(e):
    # flask 1.0 可以捕获所有异常
    if isinstance(e, APIException):
        return e

    if isinstance(e, HTTPException):
        code = e.code
        msg = e.description
        error_code = 1007
        return APIException(msg, code, error_code)
    else:
        # 做一个日志log的记录
        # 这样可读性不是很好,因此再定义一个ServerError()
        # 调试模式,显示详细信息,否则,返回我们定义的json错误信息
        if not app.config['DEBUG']:
            return ServerError()
        else:
            raise e
        return ServerError()
Exemplo n.º 24
0
 def default(self, o):
     # 把对象转换为字典,__init__类的变量是不会被存在__dict__,实例变量不会存在于这里面。例如init里面的
     # 一个对象不可以用o['name']的方式访问变量,但是如果给它增加__getitem__方法后就可以,
     # getattr获取对象下面的对应值,getattr(o,item)
     # 当有keys属性,和__getitem__方法时才返回
     if hasattr(o, 'keys') and hasattr(o, '__getitem__'):
         return dict(o)
     # if isinstance(o, date):
     #     return o.strftime('%Y-%m-%d')
     raise ServerError()
Exemplo n.º 25
0
 def default(self, o):
     if hasattr(o, 'keys') and hasattr(o, '__getitem__'):
         return dict(o)
     if isinstance(o, object):
         return o.__dict__
     if isinstance(o, date):
         return o.strftime('%Y-%m-%d')
     if isinstance(o, datetime):
         return o.strftime("%Y-%m-%d %H-%M-%S")
     raise ServerError()
Exemplo n.º 26
0
def frame_workerror(e):
    if isinstance(e, APIException):
        return e
    if isinstance(e, HTTPException):
        code = e.code
        msg = e.description
        error_code = 1007
        return APIException(msg, code, error_code)
    else:
        return ServerError()
Exemplo n.º 27
0
    def default(self, o):
        if hasattr(o, 'keys') and hasattr(o, '__getitem__'):
            # 使用dict将对象序列化,需要在对象中实现keys和__getitem__方法
            return dict(o)

        if isinstance(o, date):
            # 不能序列化的对象,单独在JSONEncoder.default里来处理转化
            return o.strftime('%Y-%m-%d')

        # 不能序列化的抛出异常
        raise ServerError()
Exemplo n.º 28
0
 def default(self, o):
     """
     如果遇到不能序列化的数据,在下面添加if语句进行序列化
     :param o: 序列化的源数据
     :return: 
     """
     if hasattr(o, 'keys') and hasattr(o, '__getitem__'):
         return dict(o)
     if isinstance(o, date):
         return o.strftime('%Y-%m-%d')
     raise ServerError()
Exemplo n.º 29
0
def __http_to_wx(url):
    res = _request.Request(url=url)
    res = _request.urlopen(res)
    res = res.read().decode('ascii')
    res = json.loads(res)
    if 'openid' in res.keys():
        uid = User.register(res['openid'])
        token = generate_auth_token(uid)
        return token
    else:
        raise ServerError(msg='获取openid时异,微信内部错误')
Exemplo n.º 30
0
 def default(self, o):
     if hasattr(o, 'keys') and hasattr(o, '__getitem__'):
         return dict(o)
     if isinstance(o, date):
         return o.strftime('%Y-%m-%d')
     if isinstance(o, datetime):
         return http_date(o.utctimetuple())
     if isinstance(o, uuid.UUID):
         return str(o)
     if dataclasses and dataclasses.is_dataclass(o):
         return dataclasses.asdict(o)
     raise ServerError()