JSON API, CLI voorbeeld

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
12 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

JSON API, CLI voorbeeld

Geert Stappers
Hoi,

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.

Mijn websearch op 'python json api cli client' brengt vooral
subsets als "python json" of "python api".

Wat in de buurt komt van wat ik zoek
is https://github.com/jkbrzt/httpie


Wat hebben jullie aan andere voorbeelden in die richting?


Groeten
Geert Stappers
--
Leven en laten leven
_______________________________________________
Python-nl mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/python-nl
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: JSON API, CLI voorbeeld

Dexter-24
Een JSON api is vaak neit meer dan een http rest api. 
Dus volgens mij wil je weten hoe je met een http server kan praten in python.

Met de requests api kan je http requests uitvoeren. 
Met behulp van optparse kan je je argumenten parsen en geschikte acties op de api uitvoeren.



Dexter - DexterLabs.nl

2016-04-03 16:00 GMT+02:00 Geert Stappers <[hidden email]>:
Hoi,

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.

Mijn websearch op 'python json api cli client' brengt vooral
subsets als "python json" of "python api".

Wat in de buurt komt van wat ik zoek
is https://github.com/jkbrzt/httpie


Wat hebben jullie aan andere voorbeelden in die richting?


Groeten
Geert Stappers
--
Leven en laten leven
_______________________________________________
Python-nl mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/python-nl


_______________________________________________
Python-nl mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/python-nl
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: JSON API, CLI voorbeeld

Andriy Yurchuk
In reply to this post by Geert Stappers
Hello Geert,

I hope I understood your question correctly (my Dutch is not very good).
To implement a client for a HTTP JSON API you could use requests
(http://docs.python-requests.org). To implement a CLI app for that API
using that client, you could try argparse
(https://docs.python.org/3/library/argparse.html) or click
(http://click.pocoo.org/), depending on the complexity of the API.

---
Regards,
Andriy Yurchuk

On 03.04.2016 16:00, Geert Stappers wrote:

> Hoi,
>
> 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.
>
> Mijn websearch op 'python json api cli client' brengt vooral
> subsets als "python json" of "python api".
>
> Wat in de buurt komt van wat ik zoek
> is https://github.com/jkbrzt/httpie
>
>
> Wat hebben jullie aan andere voorbeelden in die richting?
>
>
> Groeten
> Geert Stappers
_______________________________________________
Python-nl mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/python-nl
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: JSON API, CLI voorbeeld

A.T.Hofkamp
In reply to this post by Geert Stappers

> 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.

Je code gaat uit 3 onderdelen bestaan.

1) Command-line handling. argparse of getopt zijn daar veelgebruikte bibliotheken.

2) HTTP berichten sturen/ontvangen. Python heeft daar ook een bibliotheek voor, maar de naam ben ik even kwijt (http client-side moet je hebben)

HTTP zelf geeft niets om wat je daadwerkelijk als "web-page" verstuurt, je moet alleen zorgen dat je mime-type klopt met je inhoud, en je het naar een url stuurt die je data ook verwacht.
JSON IO is dus gelijk aan HTML IO is gelijk aan .PNG IO, met alleen andere mime-types en data.
Elke "vraag html pagina van website tutorial" is dus ongeveer bruikbaar. Een image vragen of sturen komt het meest dichtbij (wegens wijzigen mime type en afhandelen van een blok data).

3) JSON coding en decoding. Volgens mij is er een json bibliotheek in Python.

_______________________________________________
Python-nl mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/python-nl
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: JSON API, CLI voorbeeld

Guido Wesdorp-3
In reply to this post by Geert Stappers
Hoi Geert,

Aangezien REST niet een volledig protocol is, zul je denk ik geen generieke client vinden. REST beschrijft in enigzins grove lijnen hoe je data en acties op die data kunt ontsluiten door handig gebruik te maken van het HTTP protocol, het beschrijft hoe je URLs zo in kunt delen dat ze netjes de structuur van je data volgen en hoe je HTTP methods kunt gebruiken om standaard acties op 'resources' (URL endpoints zeg maar) te definieren (bijv. GET om te lezen, PUT om te schrijven, POST voor niet-standaard acties, etc.), maar ook niet veel meer dan dat. Er wordt volgens mij niet eens gedefinieerd wat voor Content-Type je response data heeft (hoewel bijna iedereen JSON gebruikt, hoeft dat volgens mij niet per se) en heeft bijvoorbeeld geen oplossing voor het aangeven van het type data dat je ontsluit, je geeft met Content-Type aan dat je (bijv.) JSON verstuurt, maar niet wat voor data-type die JSON representeert. REST is dus meer een stel guide-lines dan een volledig protocol, voor bijv. WebDAV of JSON-RPC is het wel mogelijk generieke clients te schrijven, maar REST is daar gewoon niet compleet genoeg voor. Having said that, een specifieke REST client schrijven is vaak erg eenvoudig met behulp van een generieke HTTP client (library), aangezien REST zoals gezegd heel dicht bij HTTP probeert te blijven.

In de standaard library van Python zitten 3 libraries voor het maken van HTTP calls: urllib, urlllib2 en httplib. De eerste 2, 'urllib' en 'urllib2', zijn nagenoeg identiek (urllib2 is een opvolger van urllib, met wat kleine verbeteringen) en helaas niet flexibel genoeg om goeie REST clients te schrijven, voornamelijk omdat ze niet toestaan aan te geven welke HTTP method er gebruikt moet worden bij een request (geef je geen data mee wordt de GET method gebruikt, wanneer wel data wordt meegegeven POST, PUT e.d. zijn niet mogelijk). De 'httplib' library is veel flexibeler, maar ook een flink stuk moeilijker in gebruik. Eventueel kun je, zoals voorgesteld, de 'requests' library gebruiken als gulden middenweg (die staat wel toe de HTTP method te definieren, maar is een stuk eenvoudiger in gebruik dan httplib), maar die zit niet in de standaard library en zal dus moeten worden gedownload (pip install requests).

Om jouw puzzel compleet te maken, heb je nog een library nodig om JSON parsing en generatie te doen en een library om command-line argumenten te parsen. Voor het eerste heeft Python 'json' in de standaard library zitten, voor het tweede zijn er vele opties, je kunt met 'sys.argv' zelf de argumenten parsen of je kunt 'getopt' of 'argparse' of wat dan ook de argument parser 'du jour' is (zoek ff op docs.python.org).

Ik snap dat dit allemaal misschien nog een beetje vaag is, dus ff snel een voorbeeldje (vereenvoudigd, aangezien ik niet veel rekening houd met errors, redirects etc. en geen argument parsing doe), waarin ik een JSON structuur van de server afhaal met behulp van een HTTP GET request en daarna weer opsla met PUT:

import httplib
import json

conn = httplib.HTTPConnection('localhost')
conn.request('GET', '/some/path')
res = conn.getresponse()
body = res.read()
if res.status not in 200:
  # note: should handle <= 400 as error, <= 300 as redirect
  raise Exception('something went wrong: %s %s - %s' % (res.status, res.reason, body)
ctype = res.getheader('content-type')
if ctype.split(';')[0] != 'application/json':
  raise Exception('non-JSON response (%s)' % (ctype,))
data = json.loads(body)
print 'Received data on GET:', data

# adjust the data a bit and save it
data['foo'] = 'bar'
params = json.dumps(data).encode('UTF-8')
headers = {
  'Content-Type': 'application/json',
}
conn = httplib.HTTPConnection('localhost')
conn.request('PUT', '/some/path', params, headers)
res = conn.getresponse()
body = res.read()
if res.status not in 200:
  # note: should handle <= 400 as error, <= 300 as redirect
  raise Exception('something went wrong: %s %s - %s' % (res.status, res.reason, body)
ctype = res.getheader('content-type')
if ctype.split(';')[0] != 'application/json':
  raise Exception('non-JSON response (%s)' % (ctype,))
data = json.loads(body)
print 'Received data on PUT:', data

Let op dat veel van de code bestaat uit omgaan met httplib, met 'requests' zou het hele eerste stuk (regel 1 t/m 15) bijvoorbeeld kunnen worden vervangen door:

import requests

res = requests.get('http://localhost/some/path')
print res.json()

dus het is misschien handig om ook even naar die lib te kijken. In ieder geval, hou in gedachten dat je 'doodnormale' HTTP requests gaat uitvoeren, waarin toevallig de response (en waarschijnlijk ook die van het request, maar ook dat is optioneel) het MIME-type 'application/json' heeft.

Het parsen van command-line (de rest van je puzzel) is afhankelijk van de library die je gebruikt, maar die worden prima beschreven in de Python docs.

Hoop dat dit een beetje helpt!

Groeten,

Guido

2016-04-03 16:00 GMT+02:00 Geert Stappers <[hidden email]>:
Hoi,

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.

Mijn websearch op 'python json api cli client' brengt vooral
subsets als "python json" of "python api".

Wat in de buurt komt van wat ik zoek
is https://github.com/jkbrzt/httpie


Wat hebben jullie aan andere voorbeelden in die richting?


Groeten
Geert Stappers
--
Leven en laten leven
_______________________________________________
Python-nl mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/python-nl


_______________________________________________
Python-nl mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/python-nl
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: JSON API, CLI voorbeeld

Jack Jansen
In reply to this post by A.T.Hofkamp
>> 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


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, <[hidden email]>, 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
[hidden email]
https://mail.python.org/mailman/listinfo/python-nl

homeVar.py (5K) Download Attachment
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: JSON API, CLI voorbeeld

Guido Wesdorp-3
2016-04-04 12:44 GMT+02:00 Jack Jansen <[hidden email]>:
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.


Hey Jack,

Waarom niet gewoon httplib? Ik weet niet wat httplib2 en requests voor jou specifiek uit handen nemen, het zal iig wat meer tikwerk zijn met httplib, maar je kunt er alles mee en het zit in de core, toch? Ik neem aan dat httplib2 en requests ook niet veel extra's bieden voor de wat meer hard-core HTTP features (redirects misschien wel, auth misschien een beetje (basic auth header generation, maar meer niet neem ik aan?), maar caching, keep-alive, etags, etc.)?

FWIW, ik heb zelf een tijdje requests gebruikt, maar ben overal httplib gaan gebruiken (of urllib2 in eenvoudige situaties), omdat ik liever geen dependencies op third-party packages heb en httplib alles kan wat ik wilde doen (en volgens mij liep ik zelfs ergens tegenaan dat met requests niet lukte, maar ik heb geen idee meer wat, helaas).

Cheers,

Guido

_______________________________________________
Python-nl mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/python-nl
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: JSON API, CLI voorbeeld

Dexter-24
volgens mij is het idee van requests dat het de volgende core http client library wordt. 
IMO is er voor de iets complexere requests zoveel gezeik om het netjes te krijgen in de httplib* dat het aangeraden is om requests te gebruiken


Dexter - DexterLabs.nl

2016-04-04 14:23 GMT+02:00 Guido Wesdorp <[hidden email]>:
2016-04-04 12:44 GMT+02:00 Jack Jansen <[hidden email]>:
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.


Hey Jack,

Waarom niet gewoon httplib? Ik weet niet wat httplib2 en requests voor jou specifiek uit handen nemen, het zal iig wat meer tikwerk zijn met httplib, maar je kunt er alles mee en het zit in de core, toch? Ik neem aan dat httplib2 en requests ook niet veel extra's bieden voor de wat meer hard-core HTTP features (redirects misschien wel, auth misschien een beetje (basic auth header generation, maar meer niet neem ik aan?), maar caching, keep-alive, etags, etc.)?

FWIW, ik heb zelf een tijdje requests gebruikt, maar ben overal httplib gaan gebruiken (of urllib2 in eenvoudige situaties), omdat ik liever geen dependencies op third-party packages heb en httplib alles kan wat ik wilde doen (en volgens mij liep ik zelfs ergens tegenaan dat met requests niet lukte, maar ik heb geen idee meer wat, helaas).

Cheers,

Guido

_______________________________________________
Python-nl mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/python-nl



_______________________________________________
Python-nl mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/python-nl
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: JSON API, CLI voorbeeld

Guido Wesdorp-3
Ah, in dat geval zou dat dan dus mijn keuze worden, zolang het werkt... :) (Nogmaals, er was dus iets wat het niet kon volgens mij, misschien handmatig redirects afhandelen of zo? Ik weet het niet meer zeker...) Httplib is idd bewerkelijk en geen hele fraaie API, dus kan me wel voorstellen dat je het niet altijd wilt gebruiken.

Cheers,

Guido

Van: [hidden email]
Verzonden: ‎4-‎4-‎2016 15:26
Aan: [hidden email]
Onderwerp: Re: [python-nl] JSON API, CLI voorbeeld

volgens mij is het idee van requests dat het de volgende core http client library wordt. 
IMO is er voor de iets complexere requests zoveel gezeik om het netjes te krijgen in de httplib* dat het aangeraden is om requests te gebruiken


Dexter - DexterLabs.nl

2016-04-04 14:23 GMT+02:00 Guido Wesdorp <[hidden email]>:
2016-04-04 12:44 GMT+02:00 Jack Jansen <[hidden email]>:
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.


Hey Jack,

Waarom niet gewoon httplib? Ik weet niet wat httplib2 en requests voor jou specifiek uit handen nemen, het zal iig wat meer tikwerk zijn met httplib, maar je kunt er alles mee en het zit in de core, toch? Ik neem aan dat httplib2 en requests ook niet veel extra's bieden voor de wat meer hard-core HTTP features (redirects misschien wel, auth misschien een beetje (basic auth header generation, maar meer niet neem ik aan?), maar caching, keep-alive, etags, etc.)?

FWIW, ik heb zelf een tijdje requests gebruikt, maar ben overal httplib gaan gebruiken (of urllib2 in eenvoudige situaties), omdat ik liever geen dependencies op third-party packages heb en httplib alles kan wat ik wilde doen (en volgens mij liep ik zelfs ergens tegenaan dat met requests niet lukte, maar ik heb geen idee meer wat, helaas).

Cheers,

Guido

_______________________________________________
Python-nl mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/python-nl



_______________________________________________
Python-nl mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/python-nl
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

HTTP requests WAS: JSON API, CLI voorbeeld

Geert Stappers
On Mon, Apr 04, 2016 at 03:36:52PM +0200, Guido Wesdorp wrote:

> Van: Dexter, Verzonden: 4-4-2016 15:26
>
> > volgens mij is het idee van requests dat het de volgende core http
> > client library wordt.
> > IMO is er voor de iets complexere requests zoveel gezeik om het
> > netjes te krijgen in de httplib* dat het aangeraden is om requests
> > te gebruiken
>
> Ah, in dat geval zou dat dan dus mijn keuze worden, zolang het
> werkt... :) (Nogmaals, er was dus iets wat het niet kon volgens mij,
> misschien handmatig redirects afhandelen of zo? Ik weet het niet meer
> zeker...) Httplib is idd bewerkelijk en geen hele fraaie API, dus kan
> me wel voorstellen dat je het niet altijd wilt gebruiken.
>

Daar zal de URL  http://docs.python-requests.org/en/master/ bijhoren

Dank voor de selectie hulp van een "http lib" dan wel "url lib".


Groeten
Geert Stappers
--
Leven en laten leven
_______________________________________________
Python-nl mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/python-nl
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: JSON API, CLI voorbeeld, dank je wel

Geert Stappers
In reply to this post by Andriy Yurchuk

Summary: we are a community

On Sun, Apr 03, 2016 at 04:45:38PM +0200, Andriy Yurchuk wrote:

> On 03.04.2016 16:00, Geert Stappers wrote:
> >Hoi,
> >
> >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.
> >
> >Mijn websearch op 'python json api cli client' brengt vooral
> >subsets als "python json" of "python api".
> >
> >Wat in de buurt komt van wat ik zoek
> >is https://github.com/jkbrzt/httpie
> >
> >
> >Wat hebben jullie aan andere voorbeelden in die richting?
> >
>
> I hope I understood your question correctly (my Dutch is not very good).
> To implement a client for a HTTP JSON API you could use requests
> (http://docs.python-requests.org). To implement a CLI app for that
> API using that client, you could try argparse
> (https://docs.python.org/3/library/argparse.html) or click
> (http://click.pocoo.org/), depending on the complexity of the API.


Mijn vraag heb je goed begrepen. Ik bedoel: je nederlands goed genoeg.

Ook helemaal goed dat er antwoord is in een taal waar je jezelf
in kunt uitdruk en welke de andere zou kunnen gebruiken.


Daar ik, original poster, vroeg naar 1 blok wat voor mij zou kunnen passen,
heb ik nu vooral begrepen om kleinere brokken te gaan gebruiken
en daar mijn gewenst geheel van te maken.

Dank jullie wel


Groeten
Geert Stappers
--
Leven en laten leven
_______________________________________________
Python-nl mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/python-nl
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: JSON API, CLI voorbeeld

Jack Jansen
In reply to this post by Guido Wesdorp-3
Guido,
je hebt best wel gelijk. Maar een groot nadeel van httplib vind ik dat je zelf de URL moet slopen en dan een HTTPConnection of HTTPSConnection moet maken met de juiste parameters, etc etc etc. requests/httplib2 zitten wat dat betreft meer op het gemaks-nivo van urllib.

En dan voelt requests wat meer pythonesque, maar is het httplib2 model van (1) creeer object, (2) voeg alles aan parameters en zo toe wat je nodig hebt en (3) doe request vaak handiger als je allerlei opties hebt die je soms wel, soms niet nodig hebt (bijv. authentication afhankelijk van commandline argumenten).

On  04-Apr-2016, at 14:23 , Guido Wesdorp <[hidden email]> wrote:

2016-04-04 12:44 GMT+02:00 Jack Jansen <[hidden email]>:
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.


Hey Jack,

Waarom niet gewoon httplib? Ik weet niet wat httplib2 en requests voor jou specifiek uit handen nemen, het zal iig wat meer tikwerk zijn met httplib, maar je kunt er alles mee en het zit in de core, toch? Ik neem aan dat httplib2 en requests ook niet veel extra's bieden voor de wat meer hard-core HTTP features (redirects misschien wel, auth misschien een beetje (basic auth header generation, maar meer niet neem ik aan?), maar caching, keep-alive, etags, etc.)?

FWIW, ik heb zelf een tijdje requests gebruikt, maar ben overal httplib gaan gebruiken (of urllib2 in eenvoudige situaties), omdat ik liever geen dependencies op third-party packages heb en httplib alles kan wat ik wilde doen (en volgens mij liep ik zelfs ergens tegenaan dat met requests niet lukte, maar ik heb geen idee meer wat, helaas).

Cheers,

Guido
_______________________________________________
Python-nl mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/python-nl

--

Jack Jansen, <[hidden email]>, 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
[hidden email]
https://mail.python.org/mailman/listinfo/python-nl
Loading...