{"id":1304,"date":"2020-04-13T17:48:32","date_gmt":"2020-04-13T15:48:32","guid":{"rendered":"http:\/\/www.boichat.ch\/wordpress\/?p=1304"},"modified":"2023-01-18T11:44:04","modified_gmt":"2023-01-18T10:44:04","slug":"python-web-flask-sur-un-nas-synology","status":"publish","type":"post","link":"https:\/\/www.boichat.ch\/wordpress\/2020\/04\/13\/python-web-flask-sur-un-nas-synology\/","title":{"rendered":"Python Web Flask sur un NAS (Synology)"},"content":{"rendered":"\n<p> <strong><em>Date de la derni\u00e8re modification: 18 janvier 2023<\/em><\/strong><br><br>A la suite de mon article <a href=\"https:\/\/boichat.developpez.com\/tutoriels\/raspberry-pi-flask-sqlite\/\"><strong>Python Flask et SQLite pour le Raspberry Pi 3 ou 4 &#8211; exemples de communication avec des ESP32 ou ESP8266<\/strong><\/a>, il m&#8217;est venu \u00e0 l&#8217;id\u00e9e d&#8217;int\u00e9grer ce serveur <strong>Web Flask<\/strong> sur un <strong>NAS <\/strong>(Network Attached Storage) de <strong>Synology <\/strong>pour, non seulement collectionner les mesures prises par mes diff\u00e9rents Raspberry Pi, ESP8266 ou ESP32, de la m\u00eame mani\u00e8re que sur un RPi, mais aussi en permettant un acc\u00e8s de l&#8217;ext\u00e9rieur, voire d&#8217;y combiner des donn\u00e9es de ces diff\u00e9rents objets connect\u00e9s dans mon r\u00e9seau local. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<p>C&#8217;est en essayant de rediriger sur mon NAS de Synology une page Web d&#8217;un de mes Raspberry Pi, afin qu&#8217;il soit accessible de l&#8217;ext\u00e9rieur, qu&#8217;il m&#8217;est venu \u00e0 l&#8217;id\u00e9e d&#8217;utiliser les diff\u00e9rentes technologies d\u00e9crites dans l&#8217;article <a href=\"https:\/\/boichat.developpez.com\/tutoriels\/raspberry-pi-flask-sqlite\/\"><strong>Python Flask et SQLite pour le Raspberry Pi 3 ou 4 &#8211; exemples de communication avec des ESP32 ou ESP8266<\/strong><\/a>, et de d\u00e9placer les fonctionnalit\u00e9s impl\u00e9ment\u00e9es sur le Raspberry Pi (RPi) sur un serveur NAS de Synology.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Synology DDNS<\/h2>\n\n\n\n<p>Le service DDNS de Synology permet de se connecter de l&#8217;ext\u00e9rieur sur son NAS de Synology. Je ne d\u00e9crirai pas son installation qu&#8217;on peut retrouver <a rel=\"noreferrer noopener\" aria-label=\"sur le site de Synology (opens in a new tab)\" href=\"https:\/\/www.synology.com\/fr-fr\/knowledgebase\/DSM\/help\/DSM\/AdminCenter\/connection_ddns\" target=\"_blank\"><strong>sur le site de Synology<\/strong><\/a>. Je ne d\u00e9crirai non plus pas comment configurer le routeur pour rediriger correctement le port, afin qu&#8217;un URL comme  <strong>http:\/\/(mon_nom_ddns).synology.me:(mon_port_web flask\/<\/strong><br>puisse atteindre le serveur Web Flask d\u00e9crit ici.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Un exemple des plus simples<\/h2>\n\n\n<p><!--EndFragment-->Sur l&#8217;armoire, au rez-de-chauss\u00e9e de ma maison, j&#8217;ai un Raspberry Pi avec une application Java et un serveur Web qui me retourne avec l&#8217;URL <strong>http:\/\/192.168.1.xxx:8000\/status<\/strong> (<strong>xxx<\/strong> fix\u00e9 dans le routeur WiFi):<\/p>\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"592\" height=\"830\" src=\"https:\/\/www.boichat.ch\/wordpress\/wp-content\/uploads\/2020\/04\/armoire1.jpg\" alt=\"\" class=\"wp-image-1322\" srcset=\"https:\/\/www.boichat.ch\/wordpress\/wp-content\/uploads\/2020\/04\/armoire1.jpg 592w, https:\/\/www.boichat.ch\/wordpress\/wp-content\/uploads\/2020\/04\/armoire1-214x300.jpg 214w\" sizes=\"(max-width: 592px) 100vw, 592px\" \/><\/figure>\n\n\n\n<p>C&#8217;est un simulateur de pr\u00e9sence saisonnier o\u00f9, par exemple entre 7:13 et 7:43 le matin, un luminaire s&#8217;allumera pendant 340 secondes (avec de petites variations al\u00e9atoires) et s&#8217;\u00e9teindra pendant environ 35 secs. La nuit, o\u00f9 si la lumi\u00e8re est trop faible le jour, le d\u00e9tecteur de mouvement activera le luminaire pour 96 secondes. La lumi\u00e8re actuelle est de 347 et la limite \u00e0 3720 (valeurs inverses de la quantit\u00e9 de lumi\u00e8re). Le dernier mouvement a eu lieu \u00e0 7:11 et il y a aussi des indications de temp\u00e9rature. Le 16.8 degr\u00e9s indiquent sans doute un moment o\u00f9 nous avons ouvert toutes les fen\u00eatres.<\/p>\n\n\n\n<p>J&#8217;aimerais maintenant que cette page soit accessible de l&#8217;ext\u00e9rieur, c&#8217;est \u00e0 dire depuis mon NAS de Synology.<\/p>\n\n\n\n<p>Dans mon article <a href=\"https:\/\/boichat.developpez.com\/tutoriels\/raspberry-pi-flask-sqlite\/\"><strong>Python Flask et SQLite pour le Raspberry Pi 3 ou 4 &#8211; exemples de communication avec des ESP32 ou ESP8266<\/strong><\/a> nous avons quelques scripts Flask que nous allons r\u00e9utiliser.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Installation de Flask sur le Synology<\/h2>\n\n\n\n<p>Il y a diff\u00e9rentes fa\u00e7ons de d\u00e9velopper des applications sur un NAS de Synology. Il est possible de travailler avec le DiskStation Manager (DSM), mais moi je pr\u00e9f\u00e8re, comme avec mes Raspberry Pi, de pr\u00e9parer et tester mes scripts depuis mon PC Windows avec une console PuTTY, un \u00e9mulateur client de terminal client pour le protocole SSH. Nous trouveron PuTTY sur le site <a href=\"https:\/\/www.putty.org\/\"><strong>https:\/\/www.putty.org\/<\/strong><\/a>.<br><br>Pour mes scripts Python, j&#8217;ai r\u00e9serv\u00e9 un r\u00e9pertoire sur mon PC pour les stocker (voire les tester) et ensuite, avec WinSCP les transf\u00e9rer dans un sens ou l&#8217;autre depuis le NAS de Synology. WinSCP est une application Windows de transfert de fichier disponible sur le site  <a href=\"https:\/\/winscp.net\/eng\/download.php\"><strong>https:\/\/winscp.net\/eng\/download.php<\/strong><\/a> .<\/p>\n\n\n\n<p>Avec PuTTY, il faudra se loguer avec l&#8217;utilisateur <strong>admin <\/strong>pour se retrouver alors sous <strong>admin@DiskStation<\/strong> dans le r\u00e9pertoire <strong>\/var\/services\/homes\/admin<\/strong>.<\/p>\n\n\n\n<p>Il nous faudra installer tout d&#8217;abord <strong>pip<\/strong>, l&#8217;outil d&#8217;installation pour Python, s&#8217;il n&#8217;est pas encore install\u00e9, la librairie <strong>Flask <\/strong>\u00e9videmment et aussi celle de <strong>requests <\/strong>qui nous permettra d&#8217;acc\u00e9der notre page Web g\u00e9n\u00e9r\u00e9 depuis le RPi. Il faudra avoir tout de m\u00eame quelques connaissances Linux pour comprendre ce qui suit.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">admin@DiskStation:~\/flaskeur$ sudo -i\nroot@DiskStation:~# wget https:\/\/bootstrap.pypa.io\/get-pip.py\n....\n La suite: cela prend du temps:\nroot@DiskStation:~# python get-pip.py\n...\nroot@DiskStation:~# pip install flask\n... \nroot@DiskStation:~# pip install requests\n...<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Trop facile ce premier script Flask<\/h2>\n\n\n\n<p>Pour commencer par une premi\u00e8re v\u00e9rification, nous pourrions \u00e9videment r\u00e9utiliser le premier script nomm\u00e9 salut_<strong>flaskeur.py<\/strong>, d\u00e9crit au d\u00e9but de l&#8217;article Flask d\u00e9di\u00e9 au RPi, pour v\u00e9rifier l&#8217;installation, et apr\u00e8s avoir cr\u00e9\u00e9 un sous-r\u00e9pertoire <strong>flaskeur <\/strong>sur la racine de notre utilisateur pour y stocker nos scripts.<\/p>\n\n\n\n<p>Cependant nous ferons tout de suite beaucoup plus fort avec le script <strong>test1.py<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code has-background\" style=\"background:#e2e9ec\"><code>\n# armoire.py\n\nfrom flask import Flask\nimport requests\n\napp = Flask(__name__)\n\n@app.route('\/')\ndef home():\n  r = requests.get(\"http:\/\/192.168.1.134:8000\/status\")\n  return r.text\n\nif __name__ == '__main__':\n  app.run(host='0.0.0.0', port=8800, debug=True)<\/code><\/pre>\n\n\n\n<p>Apr\u00e8s avoir import\u00e9 la librairie Flask, on lui donne le nom <strong>app<\/strong>. La fonction <strong>home()<\/strong> va nous permettre de g\u00e9n\u00e9rer une page Web pour la racine de ce site. Cette fonction va g\u00e9n\u00e9rer le document html venant de la page <strong>http:\/\/192.168.1.134:8000\/status<\/strong> correspondant la page &#8220;Armoire&#8221; de notre site Web sur notre Raspberry Pi vu pr\u00e9c\u00e9demment. La fonction <strong>get()<\/strong> de la librairie Python <strong>requests <\/strong>fera le job suivi du <strong>return <\/strong>pour envoyer le contenu.<\/p>\n\n\n\n<p>Nous pouvons \u00e0 pr\u00e9sent tester le script:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">admin@DiskStation:~\/flaskeur$ python test1.py\n Serving Flask app \"test1\" (lazy loading)\n Environment: production\n WARNING: This is a development server. Do not use it in a production deployme                   nt.\n Use a production WSGI server instead.\n Debug mode: on\n Running on http:\/\/0.0.0.0:8800\/ (Press CTRL+C to quit)\n Restarting with stat\n Debugger is active!\n Debugger PIN: 102-642-322\n 192.168.1.110 - - [16\/Apr\/2020 09:31:01] \"GET \/ HTTP\/1.1\" 200 -\n 192.168.1.110 - - [16\/Apr\/2020 09:31:01] \"GET \/favicon.ico HTTP\/1.1\" 404 - <\/pre>\n\n\n\n<p>que nous v\u00e9rifierons avec <strong>http:\/\/192.168.1.xx:8800\/<\/strong> avec <strong>xx <\/strong>\u00e9tant la derni\u00e8re partie de l&#8217;adresse IP de notre NAS accessible dans le r\u00e9seau local depuis le PC Windows.<br><br>Nous retrouverons alors notre page Web <strong>V.22.02.2020 &#8211; Armoire<\/strong> montr\u00e9e pr\u00e9c\u00e9demment et \u00e9videmment avec les donn\u00e9es du moment (<strong>Time now<\/strong> sur la seconde ligne de la page Web \u00e9tant l&#8217;heure au moment de la requ\u00eate).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">D\u00e9finition d&#8217;un script de d\u00e9marrage<\/h2>\n\n\n\n<p>Le script pr\u00e9c\u00e9dent devra \u00eatre adapt\u00e9 avec le port <strong>8800 <\/strong>modifi\u00e9 avec celui ouvert par le routeur (voir partie DDNS pr\u00e9c\u00e9dente) pour qu&#8217;un URL comme  <strong>http:\/\/(mon_nom_ddns).synology.me:(mon_port_web flask\/<\/strong> puisse fonctionner depuis l&#8217;ext\u00e9rieur.<\/p>\n\n\n\n<p><strong>ATTENTION!<\/strong> Un test avec ce lien va certainement fonctionner depuis la maison avec une connexion WiFi ou c\u00e2bl\u00e9e dans et sur notre r\u00e9seau.<br>Pour une vrai v\u00e9rification, il faudra se connecter avec par exemple un smartphone avec connexion r\u00e9seau et sans WiFi, ou alors demander \u00e0 une personne ext\u00e9rieur de faire le test.<\/p>\n\n\n\n<p>Nous nous rendrons tout d&#8217;abord dans le r\u00e9pertoire <strong>\/etc\/init<\/strong>. Nous y trouverons toute une s\u00e9rie de fichier <strong>.conf<\/strong>. <\/p>\n\n\n\n<p>Nous allons cr\u00e9er notre propre fichier <strong>flaskjbb.conf<\/strong>: <\/p>\n\n\n\n<pre class=\"wp-block-code has-background\" style=\"background:#e2e9ec\"><code>\ndescription \"Start flask external Web\"\nauthor \"Jean-Bernard\"\n\nrespawn\n\nexec \/var\/services\/homes\/admin\/flaskeur\/start.sh<\/code><\/pre>\n\n\n\n<p>Nous le copierons aussi dans notre r\u00e9pertoire <strong>\/var\/services\/homes\/admin\/flaskeur<\/strong> afin de le conserver au cas ou le r\u00e9pertoire <strong>\/etc\/init<\/strong> serait \u00e9cras\u00e9 ou remplac\u00e9 par une installation d&#8217;une nouvelle version du DSM de Synology.<\/p>\n\n\n\n<p>Le fichier <strong>\/var\/services\/homes\/admin\/flaskeur\/start.sh<\/strong> sera d\u00e9fini ainsi avec un <strong>chmod +x<\/strong> usuel:<\/p>\n\n\n\n<pre class=\"wp-block-code has-background\" style=\"background:#e2e9ec\"><code>\ncd \/var\/services\/homes\/admin\/flaskeur\npython mon_flaskeur.py >\/dev\/null &amp;<\/code><\/pre>\n\n\n\n<p> Et \u00e9videmment le fichier <strong>mon_flaskeur.py<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code has-background\" style=\"background:#eeeeee\"><code>\n# mon_flaskeur.py\n\nfrom flask import Flask\nimport requests\n\napp = Flask(__name__)\n\n@app.route('\/')\ndef home():\n  r = requests.get(\"http:\/\/192.168.1.134:8000\/status\")\n  return r.text\n\nif __name__ == '__main__':\n  app.run(host='0.0.0.0', port=XXXX, debug=True)\n<\/code><\/pre>\n\n\n\n<p><strong>XXXX <\/strong>sera le port d\u00e9j\u00e0 d\u00e9crit, de celui ouvert par le router pour notre acc\u00e8s DDNS de l&#8217;ext\u00e9rieur.<\/p>\n\n\n\n<p>Pour d\u00e9marrer et stopper ce service <strong>flaskjbb <\/strong>nous utiliserons les commandes:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">admin@DiskStation:~\/flaskeur$ sudo start flaskjbb\nPassword:\nflaskjbb start\/spawned, process 5242\nadmin@DiskStation:~\/flaskeur$ sudo stop flaskjbb\nstop: Unknown instance:<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Am\u00e9liorer notre premier exemple<\/h2>\n\n\n\n<p>Le script pr\u00e9c\u00e9dent va nous donner une s\u00e9rie d&#8217;exception dans le cas o\u00f9 notre <strong>http:\/\/192.168.1.134:8000\/status <\/strong>est inaccessible. Afin d&#8217;am\u00e9liorer notre programmation en Python, nous allons \u00e0 pr\u00e9sent utiliser PyDev, une extension \u00e0 Eclipse. Nous y trouverons une description dans l&#8217;article <strong><a href=\"https:\/\/boichat.developpez.com\/tutoriels\/python\/apprendre-utiliser-pydev\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\" (opens in a new tab)\">PyDev, un IDE pour Python, sous Eclipse et pour le Raspberry Pi 3<\/a><\/strong>. <\/p>\n\n\n<p><!--EndFragment--><\/p>\n\n\n<p>Le code qui suit va inclure le traitement de l&#8217;exception, d\u00fb \u00e0 un timeout, si l&#8217;URL n&#8217;est pas atteignable. Nous avons volontairement utiliser l&#8217;adresse 135, celle d&#8217;un autre RPi que je n&#8217;avais pas connect\u00e9. J&#8217;ai sp\u00e9cifi\u00e9 un timeout raisonnable de 3 secondes.<\/p>\n\n\n\n<p> Et \u00e9videmment le nouveau fichier <strong>mon_flaskeur.py<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code has-background\" style=\"background:#eeeeee\"><code>\n#http:\/\/127.0.0.1:5001\n# mon_flaskeur.py\n\nfrom flask import Flask\nimport requests\n\napp = Flask(__name__)\n\n@app.route('\/')\ndef home():\n  try:\n    r = requests.get(\"http:\/\/192.168.1.135:8000\/status\", timeout=3.0)\n    return r.text\n  except:\n    resp = \"http:\/\/192.168.1.135:8000\/status is not reachable!\"\n    return resp\n\nif __name__ == '__main__':\n  app.run(host='0.0.0.0', port=XXXX, debug=True)\n  \n<\/code><\/pre>\n\n\n\n<p><strong>XXXX <\/strong>sera le port d\u00e9j\u00e0 d\u00e9crit, donc celui ouvert par le router pour notre acc\u00e8s DDNS de l&#8217;ext\u00e9rieur.<br>La premi\u00e8re ligne est utile pour tester sur le PC Windows sous Eclipse avec PyDev. C&#8217;est expliquer dans l&#8217;article que nous venons de citer.<\/p>\n\n\n\n<p> <strong>A suivre &#8230;.<\/strong> avec d&#8217;autres exemples comme d\u00e9j\u00e0 celui-ci en travail!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Un ESP8266 avec mesure de temp\u00e9rature et de lumi\u00e8re<\/h2>\n\n\n\n<p>Nous allons presque tout mettre sur cet ESP8266, des composants \u00e9lectroniques int\u00e9ressants et de la technologie \u00e0 la hauteur de nos attentes.<br><br>Lorsqu&#8217;on d\u00e9pose des composants sur une platine d&#8217;essai, et ensuite qu&#8217;on les attache \u00e0 l&#8217;ESP8266 via les broches choisies, il est important de d\u00e9poser, au d\u00e9but de notre sketch, du code pour montrer dans notre console COM de l&#8217;IDE de l&#8217;Arduino que, le WiFi fonctionne, son adresse IP, ainsi que les premi\u00e8res valeurs lues \u00e0 l&#8217;initialisation pour la temp\u00e9rature et l&#8217;intensit\u00e9 lumineuse.<\/p>\n\n\n\n<p>D\u00e8s que nous aurons d\u00e9connect\u00e9 le c\u00e2ble, d\u00e9plac\u00e9 notre syst\u00e8me \u00e0 l&#8217;endroit d\u00e9sir\u00e9, il sera bien de pouvoir acc\u00e9der ces deux valeurs au travers d&#8217;un mini serveur Web.<\/p>\n\n\n\n<p>Ensuite, le code client du POST http pourra \u00eatre utilis\u00e9 d\u00e8s qu&#8217;un serveur Flask sera en place tout d&#8217;abord pour des tests sur un PC Windows with Eclipse et son extension PiDev, et ensuite sur un Raspberry Pi avec une base de donn\u00e9es SQLite, et finalement sur un NAS de Synology, toujours avec Flask et Python, et, pourquoi pas, sur une base mySQL.  <\/p>\n\n\n<p><!--EndFragment--><\/p>\n\n\n<p>A venir: sch\u00e9ma, photo et sketch.<\/p>\n\n\n<p><!--EndFragment--><\/p>\n<p><!--EndFragment--><\/p>\n<p><!--EndFragment--><\/p>\n\n","protected":false},"excerpt":{"rendered":"<p>A la suite de mon article Python Flask et SQLite pour le Raspberry Pi 3 ou 4 &#8211; exemples de communication avec des ESP32 ou&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"ngg_post_thumbnail":0,"footnotes":""},"categories":[7],"tags":[10],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Python Web Flask sur un NAS (Synology) - Jean-Bernard Boichat<\/title>\n<meta name=\"description\" content=\"Site de Jean-Bernard Boichat consacr\u00e9 principalement \u00e0 Wordpress, Elementor, l&#039;impression 3D, l&#039;\u00e9lectricit\u00e9, les installations photovolta\u00efques et la voiture \u00e9lectrique.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.boichat.ch\/wordpress\/2020\/04\/13\/python-web-flask-sur-un-nas-synology\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Python Web Flask sur un NAS (Synology) - Jean-Bernard Boichat\" \/>\n<meta property=\"og:description\" content=\"Site de Jean-Bernard Boichat consacr\u00e9 principalement \u00e0 Wordpress, Elementor, l&#039;impression 3D, l&#039;\u00e9lectricit\u00e9, les installations photovolta\u00efques et la voiture \u00e9lectrique.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.boichat.ch\/wordpress\/2020\/04\/13\/python-web-flask-sur-un-nas-synology\/\" \/>\n<meta property=\"og:site_name\" content=\"Jean-Bernard Boichat\" \/>\n<meta property=\"article:published_time\" content=\"2020-04-13T15:48:32+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-01-18T10:44:04+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.boichat.ch\/wordpress\/wp-content\/uploads\/2020\/04\/armoire1.jpg\" \/>\n<meta name=\"author\" content=\"Jean-Bernard Boichat\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jean-Bernard Boichat\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.boichat.ch\/wordpress\/2020\/04\/13\/python-web-flask-sur-un-nas-synology\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.boichat.ch\/wordpress\/2020\/04\/13\/python-web-flask-sur-un-nas-synology\/\"},\"author\":{\"name\":\"Jean-Bernard Boichat\",\"@id\":\"https:\/\/www.boichat.ch\/wordpress\/#\/schema\/person\/fe6328cc5b74b8a6e8d841285a928751\"},\"headline\":\"Python Web Flask sur un NAS (Synology)\",\"datePublished\":\"2020-04-13T15:48:32+00:00\",\"dateModified\":\"2023-01-18T10:44:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.boichat.ch\/wordpress\/2020\/04\/13\/python-web-flask-sur-un-nas-synology\/\"},\"wordCount\":1569,\"publisher\":{\"@id\":\"https:\/\/www.boichat.ch\/wordpress\/#\/schema\/person\/fe6328cc5b74b8a6e8d841285a928751\"},\"keywords\":[\"Python Flask Synology NAS Raspberry Pi ESP8266 ESP32\"],\"articleSection\":[\"Python Flask\"],\"inLanguage\":\"fr-FR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.boichat.ch\/wordpress\/2020\/04\/13\/python-web-flask-sur-un-nas-synology\/\",\"url\":\"https:\/\/www.boichat.ch\/wordpress\/2020\/04\/13\/python-web-flask-sur-un-nas-synology\/\",\"name\":\"Python Web Flask sur un NAS (Synology) - Jean-Bernard Boichat\",\"isPartOf\":{\"@id\":\"https:\/\/www.boichat.ch\/wordpress\/#website\"},\"datePublished\":\"2020-04-13T15:48:32+00:00\",\"dateModified\":\"2023-01-18T10:44:04+00:00\",\"description\":\"Site de Jean-Bernard Boichat consacr\u00e9 principalement \u00e0 Wordpress, Elementor, l'impression 3D, l'\u00e9lectricit\u00e9, les installations photovolta\u00efques et la voiture \u00e9lectrique.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.boichat.ch\/wordpress\/2020\/04\/13\/python-web-flask-sur-un-nas-synology\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.boichat.ch\/wordpress\/2020\/04\/13\/python-web-flask-sur-un-nas-synology\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.boichat.ch\/wordpress\/2020\/04\/13\/python-web-flask-sur-un-nas-synology\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.boichat.ch\/wordpress\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Python Web Flask sur un NAS (Synology)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.boichat.ch\/wordpress\/#website\",\"url\":\"https:\/\/www.boichat.ch\/wordpress\/\",\"name\":\"Jean-Bernard Boichat\",\"description\":\"Mon site WordPress\",\"publisher\":{\"@id\":\"https:\/\/www.boichat.ch\/wordpress\/#\/schema\/person\/fe6328cc5b74b8a6e8d841285a928751\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.boichat.ch\/wordpress\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.boichat.ch\/wordpress\/#\/schema\/person\/fe6328cc5b74b8a6e8d841285a928751\",\"name\":\"Jean-Bernard Boichat\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/www.boichat.ch\/wordpress\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/862886ce35a52b9d13595e18ac3c3ea5?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/862886ce35a52b9d13595e18ac3c3ea5?s=96&d=mm&r=g\",\"caption\":\"Jean-Bernard Boichat\"},\"logo\":{\"@id\":\"https:\/\/www.boichat.ch\/wordpress\/#\/schema\/person\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Python Web Flask sur un NAS (Synology) - Jean-Bernard Boichat","description":"Site de Jean-Bernard Boichat consacr\u00e9 principalement \u00e0 Wordpress, Elementor, l'impression 3D, l'\u00e9lectricit\u00e9, les installations photovolta\u00efques et la voiture \u00e9lectrique.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.boichat.ch\/wordpress\/2020\/04\/13\/python-web-flask-sur-un-nas-synology\/","og_locale":"fr_FR","og_type":"article","og_title":"Python Web Flask sur un NAS (Synology) - Jean-Bernard Boichat","og_description":"Site de Jean-Bernard Boichat consacr\u00e9 principalement \u00e0 Wordpress, Elementor, l'impression 3D, l'\u00e9lectricit\u00e9, les installations photovolta\u00efques et la voiture \u00e9lectrique.","og_url":"https:\/\/www.boichat.ch\/wordpress\/2020\/04\/13\/python-web-flask-sur-un-nas-synology\/","og_site_name":"Jean-Bernard Boichat","article_published_time":"2020-04-13T15:48:32+00:00","article_modified_time":"2023-01-18T10:44:04+00:00","og_image":[{"url":"http:\/\/www.boichat.ch\/wordpress\/wp-content\/uploads\/2020\/04\/armoire1.jpg"}],"author":"Jean-Bernard Boichat","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"Jean-Bernard Boichat","Dur\u00e9e de lecture estim\u00e9e":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.boichat.ch\/wordpress\/2020\/04\/13\/python-web-flask-sur-un-nas-synology\/#article","isPartOf":{"@id":"https:\/\/www.boichat.ch\/wordpress\/2020\/04\/13\/python-web-flask-sur-un-nas-synology\/"},"author":{"name":"Jean-Bernard Boichat","@id":"https:\/\/www.boichat.ch\/wordpress\/#\/schema\/person\/fe6328cc5b74b8a6e8d841285a928751"},"headline":"Python Web Flask sur un NAS (Synology)","datePublished":"2020-04-13T15:48:32+00:00","dateModified":"2023-01-18T10:44:04+00:00","mainEntityOfPage":{"@id":"https:\/\/www.boichat.ch\/wordpress\/2020\/04\/13\/python-web-flask-sur-un-nas-synology\/"},"wordCount":1569,"publisher":{"@id":"https:\/\/www.boichat.ch\/wordpress\/#\/schema\/person\/fe6328cc5b74b8a6e8d841285a928751"},"keywords":["Python Flask Synology NAS Raspberry Pi ESP8266 ESP32"],"articleSection":["Python Flask"],"inLanguage":"fr-FR"},{"@type":"WebPage","@id":"https:\/\/www.boichat.ch\/wordpress\/2020\/04\/13\/python-web-flask-sur-un-nas-synology\/","url":"https:\/\/www.boichat.ch\/wordpress\/2020\/04\/13\/python-web-flask-sur-un-nas-synology\/","name":"Python Web Flask sur un NAS (Synology) - Jean-Bernard Boichat","isPartOf":{"@id":"https:\/\/www.boichat.ch\/wordpress\/#website"},"datePublished":"2020-04-13T15:48:32+00:00","dateModified":"2023-01-18T10:44:04+00:00","description":"Site de Jean-Bernard Boichat consacr\u00e9 principalement \u00e0 Wordpress, Elementor, l'impression 3D, l'\u00e9lectricit\u00e9, les installations photovolta\u00efques et la voiture \u00e9lectrique.","breadcrumb":{"@id":"https:\/\/www.boichat.ch\/wordpress\/2020\/04\/13\/python-web-flask-sur-un-nas-synology\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.boichat.ch\/wordpress\/2020\/04\/13\/python-web-flask-sur-un-nas-synology\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.boichat.ch\/wordpress\/2020\/04\/13\/python-web-flask-sur-un-nas-synology\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.boichat.ch\/wordpress\/"},{"@type":"ListItem","position":2,"name":"Python Web Flask sur un NAS (Synology)"}]},{"@type":"WebSite","@id":"https:\/\/www.boichat.ch\/wordpress\/#website","url":"https:\/\/www.boichat.ch\/wordpress\/","name":"Jean-Bernard Boichat","description":"Mon site WordPress","publisher":{"@id":"https:\/\/www.boichat.ch\/wordpress\/#\/schema\/person\/fe6328cc5b74b8a6e8d841285a928751"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.boichat.ch\/wordpress\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":["Person","Organization"],"@id":"https:\/\/www.boichat.ch\/wordpress\/#\/schema\/person\/fe6328cc5b74b8a6e8d841285a928751","name":"Jean-Bernard Boichat","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.boichat.ch\/wordpress\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/862886ce35a52b9d13595e18ac3c3ea5?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/862886ce35a52b9d13595e18ac3c3ea5?s=96&d=mm&r=g","caption":"Jean-Bernard Boichat"},"logo":{"@id":"https:\/\/www.boichat.ch\/wordpress\/#\/schema\/person\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.boichat.ch\/wordpress\/wp-json\/wp\/v2\/posts\/1304"}],"collection":[{"href":"https:\/\/www.boichat.ch\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.boichat.ch\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.boichat.ch\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.boichat.ch\/wordpress\/wp-json\/wp\/v2\/comments?post=1304"}],"version-history":[{"count":0,"href":"https:\/\/www.boichat.ch\/wordpress\/wp-json\/wp\/v2\/posts\/1304\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.boichat.ch\/wordpress\/wp-json\/wp\/v2\/media?parent=1304"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.boichat.ch\/wordpress\/wp-json\/wp\/v2\/categories?post=1304"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.boichat.ch\/wordpress\/wp-json\/wp\/v2\/tags?post=1304"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}