fdi.pns.jsonio 源代码

# -*- coding: utf-8 -*-
from ..dataset.serializable import serialize
from ..dataset.deserialize import deserialize
from ..utils.common import lls

import logging
import copy
import base64
import json

# HTTPConnection.debuglevel = 1


import sys
if sys.version_info[0] > 2:
    #from urllib.parse import urlencode
    from urllib.request import urlopen
    from urllib.parse import urlsplit
    from urllib.error import HTTPError
    import requests
    from http.client import HTTPConnection
else:
    #from urllib import urlencode
    from urllib2 import urlopen
    from urlparse import urlsplit
    from urllib2 import HTTPError
    from httplib import HTTPConnection

logger = logging.getLogger(__name__)
#logger.debug('level %d' % (logger.getEffectiveLevel()))
#print('level %d' % (logger.getEffectiveLevel()))

if 0:
    print(logger.propagate)
    print(logger.disabled)
    print(logger.filters)
    print(logger.hasHandlers())
    print(logger.handlers)
    print(logger.level)


commonheaders = {
    'Accept': 'application/json',
    'Accept-Charset': 'utf-8',
    'Accept-Encoding': 'identity',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
    "Content-type": 'application/json'
}


[文档]def auth_headers(username, password, headers=None): if headers is None: headers = copy.copy(commonheaders) up = bytes((username + ':' + password).encode('ascii')) code = base64.b64encode(up).decode("ascii") headers.update({'Authorization': 'Basic %s' % (code)}) return headers
[文档]def getJsonObj(url, headers=None, usedict=True, **kwds): """ return object from url. url can be http or file. translate keys and values from string to number if applicable. Raise exception if fails. Not using requests.get() as it cannot open file:/// w/o installing https://pypi.python.org/pypi/requests-file """ logger.debug('url: %s' % (url)) stri = urlopen( url, timeout=15).read().decode('utf-8') #logger.debug('stri ' + stri) # print(url,stri) # ret = json.loads(stri, parse_float=Decimal) # ret = json.loads(stri, cls=Decoder, # object_pairs_hook=collections.OrderedDict) ret = deserialize(stri, usedict=usedict, **kwds) #logger.debug(pformat(ret, depth=6)[:] + '...') logger.debug(lls(str(ret), 160)) return ret
[文档]def getJsonObj1(url, headers=None, usedict=False): """ return object from url. url can be http or file. translate keys and values from string to number if applicable. Return None if fails. Not using requests.get() as it cannot open file:/// w/o installing https://pypi.python.org/pypi/requests-file """ logger.debug('url: %s' % (url)) i = 1 while True: try: stri = urlopen( url, timeout=15).read().decode('utf-8') #logger.debug('stri ' + stri) break except Exception as e: logger.debug(e) if issubclass(e.__class__, HTTPError): print(e.code) print('urllib ' + e.read()) ret = e return None if i >= 1: logger.error("Give up " + url + " after %d tries." % i) return None else: i += 1 # print(url,stri) # ret = json.loads(stri, parse_float=Decimal) # ret = json.loads(stri, cls=Decoder, # object_pairs_hook=collections.OrderedDict) ret = deserialize(stri, usedict=usedict) #logger.debug(pformat(ret, depth=6)[:] + '...') logger.debug(lls(str(ret), 160)) return ret
[文档]def jsonREST(url, obj, headers, cmd): """ generic RESTful command handler for POST, PUT, and DELETE. """ js = serialize(obj) # %s obj %s headers %s' % (url, obj, headers)) logger.debug(url + lls(js, 160)) i = 1 while True: try: if 0 and sys.version_info[0] > 2: if cmd == 'POST': r = requests.post( url, data=js, headers=headers, timeout=15) elif cmd == 'PUT': r = requests.post( url, data=js, headers=headers, timeout=15) elif cmd == 'DELETE': r = requests.post( url, data=js, headers=headers, timeout=15) else: raise ValueError('Bad REST command ' + cmd) stri = r.text else: o = urlsplit(url) u = o.netloc p = o.path + '?' + o.query + '#' + o.fragment h = HTTPConnection(u, timeout=15) h.request(cmd, p, js, headers) r = h.getresponse() stri = r.read() # print('ps textx %s\nstatus %d\nheader %s' % (stri, r.status_code, r.headers)) break except Exception as e: logger.debug(e) if i >= 1: logger.error("Give up %s %s after %d tries." % (cmd, url, i)) return None else: i += 1 # ret = json.loads(stri, parse_float=Decimal) # ret = json.loads(stri, cls=Decoder) ret = deserialize(stri) logger.debug(str(ret)[:160] + '...') return ret
[文档]def postJsonObj(url, obj, headers): """ posts object to url. Returns None if fails. """ return jsonREST(url, obj, headers, 'POST')
[文档]def putJsonObj(url, obj, headers): """ puts object to url. Returns None if fails. """ return jsonREST(url, obj, headers, 'PUT')
[文档]def deleteJsonObj(url, obj, headers): """ deletes object from url. Returns None if fails. """ return jsonREST(url, obj, headers, 'DELETE')
[文档]def writeJsonObj(o, fn): """ Write an object to file fn in json safely Return True if successful else False """ for i in range(5): try: f = open(fn, 'w') except OSError: logger.warn('unable to open %f for writing. %d' % (fn, i)) if i == 5: logger.error('unable to open %f for writing.' % (fn)) return False json.dump(o, f) f.close() return True