{"id":458,"date":"2017-02-13T19:05:52","date_gmt":"2017-02-13T18:05:52","guid":{"rendered":"https:\/\/thedutchguys.com\/?p=458"},"modified":"2019-01-30T20:26:01","modified_gmt":"2019-01-30T19:26:01","slug":"python","status":"publish","type":"post","link":"https:\/\/thijsbekke.nl\/blog\/2017\/02\/13\/python\/","title":{"rendered":"Python"},"content":{"rendered":"<span class=\"rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Leestijd: <\/span> <span class=\"rt-time\">2<\/span> <span class=\"rt-label rt-postfix\">Minuten<\/span><\/span><p>Dit jaar wil ik elke maand iets maken. Een stuk code, een soldeer project, iets in de tuin of huis. Het doel is om het af te krijgen in die maand en daar de focus op te leggen. Afgelopen maand ben ik bezig geweest mijn Python skills verder uit te breiden. Wat ik graag wou ik een REST API maken waar je een postcode mee kan raadplegen. Bijvoorbeeld een <code>GET<\/code> naar <code>\/api\/v1\/zipcode\/1011PN\/1<\/code> geeft als resultaat het telefoon nummer en verdere informatie over dat postcode. En de beveiliging moest gedaan worden door middel val een key wat je mee gaf in de header.<\/p>\n<p>Voordat ik kon beginnen heb ik onderzoek gedaan hoe ik het ging maken. Python heeft vele frameworks wat dit voor je kan doen. Op de vraag welke framework het beste is kan ik je geen antwoord geven maar welke spreekt mij het meest aan, En past het meest bij mijn wensen. \u00c9\u00e9n van mijn eisen was een API key mee sturen in de header in plaats van wat je veel ziet een username en password meesturen.<\/p>\n<p>Uiteindelijk ben ik gegaan voor het framework FLASK, mede door de decorators hoe je een REST functie kan defini\u00ebren.<\/p>\n<pre class=\"lang:python decode:true \">@app.route('\/api\/v1\/zipcode\/&lt;zipcode&gt;\/&lt;number&gt;', methods=['GET'])\r\n@auth.login_required\r\ndef get_zipcode_number(zipcode,number):\r\n\t# Je code<\/pre>\n<p>Het zoeken naar hoe je een API key meestuurt in je header kwam steeds uit op de volgende <a href=\"https:\/\/blog.miguelgrinberg.com\/post\/restful-authentication-with-flask\" target=\"_blank\">website<\/a>. Maar zo wou ik het niet, deze persoon misbruikt het username en password veld om een API key mee te sturen. Hoe ik dat deel zelf heb gemaakt lees je hieronder.<br \/>\n<!--more--><\/p>\n<p>Door de decorator <code>@auth.login_required<\/code> toe te voegen aan je functie wordt er gekeken of je de header <code>Authorization<\/code> hebt gedefinieerd. Mocht dit niet zo zijn dan wordt er een error getriggerd.<\/p>\n<pre class=\"lang:python decode:true \" >if 'Authorization' not in request.headers:\r\n\trequest.data\r\n\treturn self.auth_error_callback()<\/pre>\n<p>Wanneer deze header er wel is wordt de <code>authenticate<\/code> callback aangeroepen. <\/p>\n<pre class=\"lang:php decode:true \" >token = request.headers['Authorization']\r\n\tif self.authenticate_callback(token) is False:\r\n\t\trequest.data\r\n\t\treturn self.auth_error_callback()<\/pre>\n<p>Deze callbacks definieer je in je applicatie zelf. In onderstaande voorbeeld haal ik de token\/key uit een MySQL database.<\/p>\n<pre class=\"lang:python decode:true \" >class Token(Base):\r\n\t__tablename__ = 'token'\r\n\r\n\tid = Column(Integer, primary_key=True)\r\n\ttoken = Column(String)\r\n\r\n\tdef __repr__(self):\r\n\t\treturn \"&lt;Token(token='%s')&gt;\" % (self.token)\r\n\r\napp = Flask(__name__)\r\nauth = TokenAuth()\r\n\r\n\r\n@auth.authenticate\r\ndef authenticate(token):\r\n\tfilter = {'token': token}\r\n\tquery = session.query(Token).filter_by(**filter)\r\n\r\n\tif (query.first() is None):\r\n\t\treturn False\r\n\r\n\treturn True\r\n\r\nengine = create_engine('mysql+pymysql:\/\/user:password#@host\/zipcode?charset=utf8', echo=True)\r\n\r\nif __name__ == '__main__':\r\n\tSession = sessionmaker(bind=engine)\r\n\tsession = Session()\r\n\r\n\tapp.run(debug=False)<\/pre>\n<p>Zie mijn <a href=\"https:\/\/gist.github.com\/thijsbekke\/2677f3e739aa75e0fa559ed69de41bc7\" target=\"_blank\">Github <\/a>voor de volledige code;<\/p>\n","protected":false},"excerpt":{"rendered":"<p><span class=\"rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Leestijd: <\/span> <span class=\"rt-time\">2<\/span> <span class=\"rt-label rt-postfix\">Minuten<\/span><\/span> Dit jaar wil ik elke maand iets maken. Een stuk code, een soldeer project, iets in de tuin of huis. Het doel is om het af te krijgen in die maand en daar de focus op te leggen. Afgelopen maand ben ik bezig geweest mijn Python skills verder uit te breiden. Wat ik graag wou [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[11,12],"_links":{"self":[{"href":"https:\/\/thijsbekke.nl\/blog\/wp-json\/wp\/v2\/posts\/458"}],"collection":[{"href":"https:\/\/thijsbekke.nl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thijsbekke.nl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thijsbekke.nl\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/thijsbekke.nl\/blog\/wp-json\/wp\/v2\/comments?post=458"}],"version-history":[{"count":4,"href":"https:\/\/thijsbekke.nl\/blog\/wp-json\/wp\/v2\/posts\/458\/revisions"}],"predecessor-version":[{"id":462,"href":"https:\/\/thijsbekke.nl\/blog\/wp-json\/wp\/v2\/posts\/458\/revisions\/462"}],"wp:attachment":[{"href":"https:\/\/thijsbekke.nl\/blog\/wp-json\/wp\/v2\/media?parent=458"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thijsbekke.nl\/blog\/wp-json\/wp\/v2\/categories?post=458"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thijsbekke.nl\/blog\/wp-json\/wp\/v2\/tags?post=458"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}