Integratie van Flask en Mollie (payment provider)

Ik doe (web) vrijwilligers werk voor Licht Voor De Wereld, een Belgische ngo die streeft om de blindheid in Afrika te verminderen. Door ondervoeding en niet genoeg vitamine zijn zeer veel mensen daar blind hoewel ze eigenlijk perfect kunnen zien na een eenvoudige operatie.

Recent hadden ze een probleem : hun donatie pagina was gemaakt en gehost door een extern bedrijf, en dat bouwde zijn website af.  Ze hadden daardoor vrij snel een nieuwe donatie pagina nodig, en omdat ze ook nog eens hun eigen website aan het bijspijkeren waren, was er een probleem van het genre kip en ei : de donatie pagina moet op de nieuwe website komen, maar de nieuwe website is nog niet af. En een extern alternatief was niet direct zo gemakkelijk te vinden.

Ondertussen heb ik een tussenoplossing op poten gezet : ik heb over de loop van een week of 2,3 in mijn vrije avonduren een (basic) online donatie site opgezet voor hen, gebruik makend van Flask en met integratie van de API van Mollie.be, hun payment provider die de eigenlijke betaling afhandelt. De design kan inderdaad beter, maar mijn focus lag vooral op het doen werken van de betalingen !

Online LFTW donatie pagina
Online donatie pagina opgezet in vrijwilligerswerk.

Ik moet zeggen dat het vrij goed meeviel om de donatie pagina op te zetten, en de mannen en vrouwen van Mollie zijn beslist bij de pinken. Ik had een paar vragen over hun webhook (=zij geven een melding aan je webserver als de betaling (niet) gebeurd is) en had direct de morgen nadien antwoord, met inbegrip van het oplossen van een stomme bug waar ik me al een paar uren op aan het blindstaren was.

Verder is hun documentatie up-to-date en kon ik hun voorbeelden bij wijze van spreken doornemen en implementeren (het had iets meer voeten in de aarde dan dat, maar goed). Ik heb zelfs een github request of twee aangemaakt voor het gebruik van een andere python library zodat ik ook op windows lokaal kon testen.

Als je denkt dat het het waard, mag je ook een donatie gaan doen (klik op de image hierboven om direct naar de site te gaan) – zo kunnen weer een paar mensen meer het licht in de ogen terugkrijgen !

Hosting Flask on Webfaction

Ik host nogal wat websites via Webfaction, die je toelaten om voor een vaste prijs per maand te kunnen experimenteren met Python, PHP, nodejs en nog andere programmeer talen.

Als je ziet wat je allemaal met je account kan (mag) doen, dan is het eigenlijk een gunstprijs.

Recent moest ik een Flask applicatie die ik geschreven had opladen. Configuratie op de server was toch nog eventjes anders dan op mijn localhost. Daar had ik alles bijeen gegooid, en gebruikte ik de ingebouwde Flask server om het snel te testen.

Maar op de server staat er een echte front-end webserver voor, Nginx of Apache, want een debug Flask server is echt voor het testen, niet voor productie omgevingen.

Die webserver heeft natuurlijk een andere configuratie, en daarom moet je eigenlijk de app die schrijft importeren vanuit index.py.

Wat links die me verder geholpen hebben :

  • Deploying A Flask App on Webfaction : vrij compleet en logisch opgezet, hoewel ik geen Virtual Environment setup gebruikte, en ook geen link naar mijn static folder moest toevoegen in de Apache config (mét werkte het gewoon niet meer). Ik had wat last met het begrijpen van de commando’s in puntje zes van zijn lijst, maar dat is omdat ik module imports niet veel gebruik, en dus ook niet helemaal onder de knie heb – nu al wat meer 🙂
  • Een oudere versie maar gelijkaardige manier van setup, meer kompleet maar minder transparant, kan je vinden op het Webfaction community forum : Installing Flask on Webfaction.

Wat ik het moeilijkste vond was de import van de app. Je importeert vanuit module x (waar x eigenlijk de folder is waarin je __init__.py staat) de app die je beschrijft in diezelfde __init__.py. Daar heb ik toch wel efkes op gevloekt tot het werkte.

Pandas, QGis en de opcentiemen in Vlaanderen

Ik wilde wat meer leren over Pandas, de data-analytics tool die je kan (leren) gebruiken in Python, en had daarvoor een dataset nodig die niet té groot was, zodat ik ook kon controleren wat ik deed in Excel.

Daarvoor heb ik de open data van de Vlaamse overheid over de opcentiemen gebruikt.

Van de ene opzoeking kwam de andere vaststelling, en uiteindelijk heb ik genoeg cijfers en graphics over de data gemaakt dat ik er ineens maar een kleine presentatie van gemaakt hebt.

Je vind deze op slideshare :

Gebruikte tools :
* Pandas en Python
* Bokeh voor sommige graphs
* Keynote voor de presentatie in te maken
* QGis voor het maken van de mapping van de opcentiemen naar een grafische kaart op slide 5

Er is wat tijd in gekropen, maar al bij al heb ik weeral enkele dingen bijgeleerd !

Fun Project : Scholen in Vlaanderen visueel voorstellen

Ik heb 2 zonen die nog naar school gaan, dus ik ben wel geïnteresseerd in onze scholen in Vlaanderen en welke soorten scholen er zijn. Op Onderwijs Vlaanderen vond ik een adreslijst van alle basisscholen in Vlaanderen, zowel kleuterschool als lagere scholen. En ik vond het wel leuk om daar eens mee te gaan spelen en dat visueel proberen voor te stellen.

Dus heb ik alle basisscholen hun adresinformatie gedownload in een csv bestand (3595 lijnen !). Vervolgens heb ik deze via “base“, een sqlite editor voor Mac, in een sqlite database omgezet. Aan deze database heb ik vervolgens de velden latitude en longitude toegevoegd.

Met behulp van de python library geopy heb ik dan een klein geocoding python script geschreven dat via Google API de adressen omzet in “latitude” en “longitude” coordinaten en deze dan bijschrijft in de database (dat duurt wel even…). En nadien heb ik met behulp van pygmaps deze map coordinaten in een lokale googlemap html file weggeschreven.

En dat geeft dan dit resultaat :

scholen-in-vlaanderen-585x358

Je kan doorklikken op bovenstaande om naar de volledige google map (1,2 MB!) te gaan en daar kan je zoomen tot op straatniveau. Als je hovert over een schoolpunt krijg je de schoolnaam te zien. Rode punten zijn hoofdvestigingen, groene punten zijn bijvestingen van een hoofdschool.

Zo op het eerste zicht hierboven lijkt het dat ons Vlaanderen land overvol zit met scholen, maar gezien het aantal mensen dat ieder jaar toeneemt om te kamperen voor schoolpoort, kan dat niet waar zijn 🙂

Als je zoomt wordt het allemaal wat overzichtelijker.

Small SQLObject Gotcha: how to activate debug

While the docs for SQLObject are extensive, they don’t cover every angle of every situation.

If you want to enable debug logging on your sqlobject connections, the manual states that you need to add ‘?debug=t’ to your connection string.

However, if you are already passing information to your connection string (for example, an alternate location for your mysql socket connection), you need to apply your thinking caps here and instead of using the ? parameter, you need to & the parameter to it so it becomes connection string + ‘&debug=t’. Like in cherrypy you are passing multiple values to your page.

Also note that it is a T and not a 1 (one).

Added here mostly for myself 🙂

Changing from feedparser.py to urllib & simplejson

With all the outages of Twitter recently, my back end system that retrieves the information from twitter was going haywire. Things kept going wrong, tweets were not retrieved, the works.

I initially coded this backend using feedparser, thinking that this code could be user later on to get rss feeds from other sites. It was a mistake to do so – I made that decision thinking that information via atom format or via json format would be similar, but this was not correct. I am *not* saying that feedparser is not good, it’s just not the right tool for the job it has to do !

The atom format that twitter returns (at current date of course – this might very well be fixed later on) is really a hodgepodge of information that is prodded and shaped into the atom format. Lots of info is repeated because really the atom format was made for larger articles of text that need a title intro, a body, etc.

All this means a much larger filesize return – certainly not enormous, but in the long run this adds up in data traffic.

Not all info that you get in json is correct in atom either. Iso_language_code which indicates the language the author primarily uses, was/is set to en-US all the time via atom format.

So with all those outages and checking and finding out that most json queries still returned correct results, I removed the feedparser lines and am now using urllib and simplejson to retrieve and parse the twitter data. Took me about 3 late evenings in a row to work through (I have a full time day job, so I only have time to do this on the train and in the evenings after 9 pm) but it’s running (almost) smooth now.

Still need to weed out a bug in my code, though – the last search does not seem to be processed… grrr.

Compiling MySQLdb for Python on mac – djeez !

This seriously needs some attention from someone with some config knowledge. Me and a horde of other python developers who transition to mac have stumbled and failed miserably on setting the python msql adapter on the mac.

Instead of using easy_install like most other python pieces you need for your project, you need to *shock, horror* download the source and compile it. Chances are too you’ll get multiple errors, depending on if you are using 32-bit or 64-bit OS X.

I’m currently running Snow Leopard, and with a change to specify the path for my_config program and telling it to compile for 64-bit

Here’s the link that solved all of my problems :Mysqldb, python and os x: a match made in Satans bum

It’s still a manual process, but at least someone found out how to fix it.

Changing DEV from SQLite to MySQL

The last few weeks I had quite a few problems with SQLite – whenever I was updating the database using threads (so multiple connections at the same time), fairly frequently a database access error would show up.

Regular usage was fine, no problems, and before I had less than 15 keywords to scan which worked fine as well. Even so, there really shouldn’t have been a problem, as I used the same number of threads to access the database.

The problem might even lie in the interaction between Dropbox, which I use to store my development work and the sqlite database in there as well.

So to solve the problem and because at some point I do need to switch over, I set up a local MySQL database and connected to it. Works fine, and seems to be heaps faster to process the returned data.

So far so good, I don’t seem to have any connection problems any more. And the MySQL Workbench to analyze your schema and tables and user accesses is a joy to work with !