>> Mijn inschatting is dat er hier mensen zijn die >> weet hebben van Python code die tegen een JSON web API >> aan kan praten. Daar zoek wat command line voorbeelden van. >> Om voor een andere API een implementatie te maken. >> >> In gebruik doe je dan >> >> command.py subcommand parameter parameter >> >> Dat er dat JSON de lijn over gaat >> en de user een statusberichtje krijgt.
Hier is wat voorbeeldcode die in ieder geval 2 van de 3 dingen doet die je wilt: - argument parsen met argparse - requests versturen met httplib2
#!/usr/bin/env python import argparse import urlparse import urllib import httplib2 import sys import os import json import pprint DEFAULT_URL="http://framboos.local:8080/data/" if 'HOMESERVER_URL' in os.environ: DEFAULT_URL = os.environ['HOMESERVER_URL'] VERBOSE=False class HomeServer: def __init__(self, url, bearer_token=None, access_token=None): self.url = url self.bearer_token = bearer_token self.access_token = access_token def get(self, item, variant=None, format=None): if format == None: format = 'application/xml' return self._action("GET", item, variant, format) def delete(self, item, variant=None, format=None): if variant == None: variant = "ref" if format == None: format = "text/plain" return self._action("DELETE", item, variant, format) def put(self, item, data, datatype, variant=None, format=None): if format == None: format = 'text/plain' return self._action("PUT", item, variant, format, data=data, datatype=datatype) def post(self, item, data, datatype, variant=None, format=None): if format == None: format = 'text/plain' return self._action("POST", item, variant, format, data=data, datatype=datatype) def _action(self, method, item, variant, format=None, data=None, datatype=None): url = urlparse.urljoin(self.url, item) query = {} if variant: query['.VARIANT'] = variant if self.access_token: query['access_token'] = self.access_token if query: assert not '?' in url url = url + '?' + urllib.urlencode(query) headers = {} if format: headers['Accept'] = format if datatype: headers['Content-Type'] = datatype if self.bearer_token: headers['Authorization'] = 'Bearer %s' % self.bearer_token h = httplib2.Http() if VERBOSE: print >>sys.stderr, ">>> GET", url print >>sys.stderr, "... Headers", headers if data: print >>sys.stderr, "... Data", repr(data) reply, content = h.request(url, method=method, headers=headers, body=data) if VERBOSE: print >>sys.stderr, "<<< Headers", reply print >>sys.stderr, "...", repr(content) if not 'status' in reply or reply['status'] != '200': print >>sys.stderr, "%s: Error %s for %s" % (sys.argv[0], reply['status'], url) print >>sys.stderr, content sys.exit(1) return content def main(): global VERBOSE parser = argparse.ArgumentParser(description="Access homeServer and other http databases") parser.add_argument("-u", "--url", help="Base URL of the server (default: %s, environment HOMESERVER_URL)" % DEFAULT_URL, default=DEFAULT_URL) parser.add_argument("-v", "--variant", help="Variant of data to get (or put, post)") parser.add_argument("-M", "--mimetype", help="Get result as given mimetype") parser.add_argument("--text", dest="mimetype", action="store_const", const="text/plain", help="Get result as plain text") parser.add_argument("--json", dest="mimetype", action="store_const", const="application/json", help="Get result as JSON") parser.add_argument("--xml", dest="mimetype", action="store_const", const="application/xml", help="Get result as XML") parser.add_argument("--python", action="store_true", help="Get result as Python (converted from JSON)") parser.add_argument("--pretty", action="store_true", help="Pretty-print result (only for Python, currently)") parser.add_argument("--verbose", action="store_true", help="Print what is happening") parser.add_argument("--delete", action="store_true", help="Delete variable") parser.add_argument("--create", action="store_true", help="Create or clear a variable") parser.add_argument("--put", metavar="MIMETYPE", help="PUT data of type MIMETYPE, from --data or stdin") parser.add_argument("--post", metavar="MIMETYPE", help="POST data of type MIMETYPE, from --data or stdin") parser.add_argument("--data", metavar="DATA", help="POST or PUT DATA, in stead of reading from stdin") parser.add_argument("-0", "--allow-empty", action="store_true", help="Allow empty data from stdin") parser.add_argument("--bearer", metavar="TOKEN", help="Add Authorization: Bearer TOKEN header line") parser.add_argument("--access", metavar="TOKEN", help="Add access_token=TOKEN query argument") parser.add_argument("var", help="Variable to retrieve") args = parser.parse_args() VERBOSE=args.verbose server = HomeServer(args.url, bearer_token=args.bearer, access_token=args.access) if args.python: args.mimetype = 'application/json' if args.delete: result = server.delete(args.var) elif args.create: result = server.put(args.var, '{}', 'application/json', variant=args.variant, format=args.mimetype) elif args.put: data = args.data if not data: data = sys.stdin.read() if not data and not args.allow_empty: print >>sys.stderr, '%s: no data read from stdin' % sys.argv[0] sys.exit(1) result = server.put(args.var, data, args.put, variant=args.variant, format=args.mimetype) elif args.post: data = args.data if not data: data = sys.stdin.read() result = server.post(args.var, data, args.post, variant=args.variant, format=args.mimetype) else: result = server.get(args.var, variant=args.variant, format=args.mimetype) if args.python: result = json.loads(result) if args.pretty: pp = pprint.PrettyPrinter() result = pp.pformat(result) else: result = repr(result) print result.strip() if __name__ == '__main__': main()
De achterliggende server is een rest-achtige database, en accepteert (en genereert) naar keuze application/json, application/xml en text/plain. De CLI accepteert/genereert ook python (dat als JSON wordt overgestuurd). Wat httplib2 betreft nog een opmerking/vraag: ik gebruik de ene keer httplib2, de andere keer keer requests, en ik heb nog steeds geen echte voorkeur, ze hebben allebei hun plussen en minnen. -- Jack Jansen, <[email protected]>, http://www.cwi.nl/~jack If I can't dance I don't want to be part of your revolution -- Emma Goldman
_______________________________________________ Python-nl mailing list [email protected] https://mail.python.org/mailman/listinfo/python-nl
