


{"id":4312,"date":"2024-12-20T11:07:23","date_gmt":"2024-12-20T11:07:23","guid":{"rendered":"https:\/\/yininit.nl\/?post_type=blossom-portfolio&#038;p=4312"},"modified":"2024-12-20T18:33:19","modified_gmt":"2024-12-20T18:33:19","slug":"webservice-eenvoudig","status":"publish","type":"blossom-portfolio","link":"https:\/\/yininit.nl\/index.php\/portfolio\/webservice-eenvoudig\/","title":{"rendered":"Webservice &#8211; eenvoudige app.py"},"content":{"rendered":"\n<p>De foutmelding <strong>&#8220;This is a development server. Do not use it in a production deployment&#8221;<\/strong> geeft aan dat Render nog steeds de ingebouwde Flask-server gebruikt in plaats van <strong>Waitress<\/strong>. Dit betekent dat je <strong>Procfile<\/strong> niet goed wordt opgepakt, of dat Render nog steeds <strong><code>python app.py<\/code><\/strong> uitvoert.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>1. Controleer je Procfile<\/strong><\/h2>\n\n\n\n<p>Open je <strong>Procfile<\/strong> en controleer of de inhoud correct is. Het bestand moet er zo uitzien:<\/p>\n\n\n\n<p><code>s-serve --port=$PORT app:app<\/code><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>web<\/strong>: Dit vertelt Render dat het om een webservice gaat.<\/li>\n\n\n\n<li><strong>waitress-serve<\/strong>: Start de Waitress WSGI-server.<\/li>\n\n\n\n<li><strong>&#8211;port=$PORT<\/strong>: Render stelt de juiste poort in via de omgeving (bijvoorbeeld poort 5000).<\/li>\n\n\n\n<li><strong>app:app<\/strong>: De eerste <code>app<\/code> verwijst naar <code>app.py<\/code>, de tweede <code>app<\/code> verwijst naar het Flask-object (<code>app = Flask(__name__)<\/code>).<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>2. Controleer <code>requirements.txt<\/code><\/strong><\/h2>\n\n\n\n<p>Zorg ervoor dat <strong>waitress<\/strong> is opgenomen in <code>requirements.txt<\/code>:<\/p>\n\n\n\n<p><code>flask flask-cors waitress<\/code><\/p>\n\n\n\n<p>Als je <code>waitress<\/code> nog niet had toegevoegd, voeg het toe en commit de wijziging:<\/p>\n\n\n\n<p><code>git add requirements.txt git commit -m \"Add waitress to requirements.txt\" git push origin main<\/code><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>3. Controleer het Start Command op Render<\/strong><\/h2>\n\n\n\n<p>Render gebruikt standaard <code>python app.py<\/code> als <strong>Start Command<\/strong>. Dit moet je overschrijven.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Ga naar je <strong>Render-dashboard<\/strong>.<\/li>\n\n\n\n<li>Open je <strong>kba-project<\/strong> service.<\/li>\n\n\n\n<li>Ga naar <strong>Settings \u2192 Environment<\/strong>.<\/li>\n\n\n\n<li>Zoek het <strong>Start Command<\/strong>.<\/li>\n\n\n\n<li>Vervang het huidige commando door: web: python -m waitress &#8211;host=0.0.0.0 &#8211;port=$PORT app:app<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>4. Herdeploy je service<\/strong><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Ga terug naar <strong>Manual Deploy<\/strong> in Render.<\/li>\n\n\n\n<li>Klik op <strong>Deploy latest commit<\/strong>.<\/li>\n<\/ol>\n\n\n\n<p>Render zal nu de service opnieuw starten met <strong>Waitress<\/strong> in plaats van de Flask ontwikkelserver.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>5. Controleer de logs<\/strong><\/h2>\n\n\n\n<p>Na het herdeployen:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open de <strong>Logs<\/strong> in je Render-dashboard.<\/li>\n\n\n\n<li>Je zou nu <strong>Waitress<\/strong> als server moeten zien in plaats van de ingebouwde Flask-server.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>6. Test je API<\/strong><\/h2>\n\n\n\n<p>Test de API via cURL (in dos cmd):<\/p>\n\n\n\n<p>curl -k -X POST -H &#8220;Content-Type: application\/json&#8221; -d &#8220;{\\&#8221;vraag\\&#8221;:\\&#8221;Hoe laat is het lunchpauze?\\&#8221;}&#8221; https:\/\/kba-project.onrender.com\/kba<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Wat het doet:<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>-X POST<\/code><\/strong>: Stelt de HTTP-methode in op POST.<\/li>\n\n\n\n<li><strong><code>-H \"Content-Type: application\/json\"<\/code><\/strong>: Geeft aan dat de data in JSON-formaat is.<\/li>\n\n\n\n<li><strong><code>-d \"{\\\"vraag\\\":\\\"Hoe laat is het lunchpauze?\\\"}\"<\/code><\/strong>: Verstuurd een JSON-object met een sleutel <code>vraag<\/code> en een waarde.<\/li>\n\n\n\n<li><strong><code>http:\/\/127.0.0.1:5000\/kba<\/code><\/strong>: Verstuurt het verzoek naar je API die lokaal draait op poort <strong>5000<\/strong>.<\/li>\n<\/ul>\n\n\n\n<p>-k is toegevoegd om:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>cURL het SSL-certificaat van je server niet kan verifi\u00ebren.<\/li>\n\n\n\n<li>Dit gebeurt vaak in staging- of testomgevingen, zoals bij Render.<\/li>\n<\/ul>\n\n\n\n<p>Gebruik <strong><code>-k<\/code><\/strong> alleen tijdens ontwikkeling. In productie moet je SSL-certificaten goed configureren om veiligheid te garanderen.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>7. Code<\/strong> app.py<\/h2>\n\n\n\n<p>from flask import Flask, request, jsonify<br>from flask_cors import CORS<\/p>\n\n\n\n<p>app = Flask(<strong>name<\/strong>)<br>CORS(app) # Sta verzoeken van andere domeinen toe<\/p>\n\n\n\n<p>@app.route(&#8220;\/kba&#8221;, methods=[&#8220;POST&#8221;])<br>def answer_question():<br>if not request.is_json:<br>return jsonify({&#8220;error&#8221;: &#8220;Verwacht JSON-data&#8221;}), 400<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>data = request.get_json()\nvraag = data.get(\"vraag\", \"\")\nif not vraag:\n    return jsonify({\"error\": \"Geen vraag ontvangen.\"}), 400\n\nantwoord = f\"Hier is je antwoord op: '{vraag}'\"\nreturn jsonify({\"vraag\": vraag, \"antwoord\": antwoord})<\/code><\/pre>\n\n\n\n<p>if <strong>name<\/strong> == &#8220;<strong>main<\/strong>&#8220;:<br>from waitress import serve<br>print(&#8220;Running production server with Waitress\u2026&#8221;)<br>serve(app, host=&#8221;0.0.0.0&#8243;, port=5000)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>De foutmelding &#8220;This is a development server. Do not use it in a production deployment&#8221; geeft aan dat Render nog steeds de ingebouwde Flask-server gebruikt in plaats van Waitress. Dit betekent dat je Procfile niet goed wordt opgepakt, of dat Render nog steeds python app.py uitvoert. 1. Controleer je Procfile Open je Procfile en controleer [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"template":"","blossom_portfolio_categories":[17],"class_list":["post-4312","blossom-portfolio","type-blossom-portfolio","status-publish","hentry","blossom_portfolio_categories-kba"],"_links":{"self":[{"href":"https:\/\/yininit.nl\/index.php\/wp-json\/wp\/v2\/blossom-portfolio\/4312","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/yininit.nl\/index.php\/wp-json\/wp\/v2\/blossom-portfolio"}],"about":[{"href":"https:\/\/yininit.nl\/index.php\/wp-json\/wp\/v2\/types\/blossom-portfolio"}],"author":[{"embeddable":true,"href":"https:\/\/yininit.nl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"wp:attachment":[{"href":"https:\/\/yininit.nl\/index.php\/wp-json\/wp\/v2\/media?parent=4312"}],"wp:term":[{"taxonomy":"blossom_portfolio_categories","embeddable":true,"href":"https:\/\/yininit.nl\/index.php\/wp-json\/wp\/v2\/blossom_portfolio_categories?post=4312"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}