コード例 #1
0
def home(request):
    # print ("HOME", request)
    try:
        endpt = request.get_full_path()
        rawquery = ""
        if "?" in endpt:
            rawquery = endpt[endpt.find("?") + 1:]
            endpt = endpt[:endpt.find("?")]
        parts = [x for x in endpt.split("/") if x != ""]
        if parts == ["favicon.ico"]:
            return dj.binary("./static/favicon.ico", "image/x-icon")
        print("PARTS:", parts)
        if len(parts) < 1:
            #        return dj.html('<div>Perhaps you need some help? try <a href="/help/docs">here</a></div>')
            parts = ["pages", "index"]
        elif len(parts) == 1:
            if parts[0].find(".") > -1:
                return dj.file(parts[0])
            parts.insert(0, "pages")
        try:
            ep = parts.pop(0)
            if ep not in endpoints.djangle_endpoints:
                if ep == "static":
                    fn = "./static/" + "/".join(parts)
                    return dj.binary(fn)
                else:
                    return dj.error("Unknown endpoint: %s" % ep)
        except:
            traceback.print_exc()
            return dj.error("must specify a module")
        try:
            func = parts.pop(0)
        except:
            return dj.error("must specify a function")
        if func not in funcnames:
            return dj.error("must specify a valid function")

        kwords = {}
        if func in getattr(endpoints, "djangle_ret_meta", ()):
            kwords['_request_meta_'] = request.META
        func = funcmap[func]
        format = "json"
        data = None
        query = parse_qstring(rawquery)
        # print ("Q:", query)
        for key, val in query.items():
            if key == "data":
                data = bytes(val, encoding='utf8')
            elif key == "format":
                format = val
            else:
                kwords[key] = val
        if request.method == "POST":

            data = request.body  #.decode('utf8'))

        if data:
            # print ("DATA: %d bytes" % len(data))
            if format == "json":
                data = json.loads(data.decode('utf8'))
            elif format == "rows":
                data = json.loads(data.decode('utf8'))
                j = []
                schema = data.pop(0)
                for row in data:
                    j.append(dict(zip(schema, row)))
                data = j
            elif format == "columns":
                data = json.loads(data.decode('utf8'))
                j = []
                m = max([len(x) for x in data.items()])
                for i in range(m):
                    row = {}
                    for k in data.keys():
                        row[k] = data[k][i]
                    j.append(row)
                data = j
            elif format == "csv":
                delim = ","
                if 'delimiter' in kwords:
                    delim = kwords['delimiter']
                    del kwords['delimiter']
                f = io.StringIO(data.decode('utf8'))
                data = []
                r = csv.reader(f, delimiter=delim)
                for schema in r:
                    break
                r = csv.reader(f, delimiter=delim)
                n = 0
                for row in r:
                    try:
                        x = {}
                        # print( len(schema) , len(row))
                        if len(schema) < len(row):
                            print("WARNING: unused data in row %d" % n)
                        if len(schema) > len(row):
                            print("WARNING: unfilled fields in row %d" % n)
                        for key, val in zip(schema, row):
                            x[key] = val
                        data.append(x)
                    except:
                        print("ERROR: csv read error at row %d" % n)
                        traceback.print_exc()
                    n += 1
                f.close()
            elif format == "raw":
                print("RAW:", type(data), len(data))
                return func(data=data)
            else:
                return dj.error("unknown format: %s" % format)

        if data == None:
            ret = func(*parts, **kwords)
            if "Response" not in str(type(ret)):
                ret = dj.json(ret)
        else:
            if type(data) != list:
                data = [data]
                count = 1
            else:
                count = len(data)
            n = 0
            rets = []
            for row in data:
                try:
                    kwords['data'] = row
                    # print ("CALLFUNC:", parts, kwords)
                    ret = func(*parts, **kwords)
                    if type(ret) == dict and "error" in ret:
                        ret["rows_processed"] = n
                        return dj.json(ret)
                    if count == 1 or ret != None:
                        rets.append(ret)
                except:
                    return dj.html(traceback.format_exc())
                n += 1
            if count > 1:
                ret = dj.json({"response": rets, "rows_processed": n})
            elif count == 1:
                try:
                    ret = dj.json(rets[0])
                except:
                    ret = "BADJSON: " + str(rets[0])
            else:
                ret = dj.error("No data processed")
        # print ("RETURNS:",ret)
        return ret
    except:
        status = 500
        trace = traceback.format_exc()
        print("DJANGLE HTTP ERROR: %d EXCEPTION: %s" %
              (status, trace.strip().split("\n")[-1]))
        print(trace)
        return dj.error("HTTP 500 error", status=status)
コード例 #2
0
def example_search(collection, **kw):
    print("RETRIEVE %s KW: %s" % (collection, kw))
    ret = dj.mongo_query_many(collection, kw)
    print("  RET", ret)
    return dj.json(ret)
コード例 #3
0
def example_testy(*args, **kw):
    return dj.json({"args": args, "keywords": kw})
コード例 #4
0
def example_version():
    return dj.json({'version': "0.0.001"})
コード例 #5
0
ファイル: endpoints.py プロジェクト: danx0r/proxy0
def proxy0_testargs(*args, **kw):
    return dj.json({"args": args, "keywords": kw})
コード例 #6
0
ファイル: endpoints.py プロジェクト: danx0r/proxy0
def proxy0_version():
    return dj.json({'version': "0.0.001"})