Changeset 434 for rmll_workshops

Show
Ignore:
Timestamp:
07/02/08 12:55:41 (21 months ago)
Author:
gawel
Message:

s5

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • rmll_workshops/web_panorama/rmll.html

    r431 r434  
    350350=================== --> 
    351351<!-- Cette présentation et les éléments de contenus associés sont placés dans le --> 
    352 <!-- domaine publique. --> 
     352<!-- domaine public. --> 
    353353<ul class="small simple"> 
    354354<li>Panorama</li> 
     
    357357</ul> 
    358358<div class="handout container"> 
    359 Ce tutorial présente un panorama des frameworks web existant en python et 
     359Ce tutoriel présente un panorama des frameworks web existant en python et 
    360360la facon de les déployer à l'aide de la norme WSGI.</div> 
    361361<div class="contents handout topic"> 
     
    363363<ul class="simple"> 
    364364<li><a class="reference" href="#frameworks-bas-niveaux" id="id3" name="id3">Frameworks bas niveaux</a></li> 
    365 <li><a class="reference" href="#exemple-de-hello-world" id="id4" name="id4">Exemple de Hello World</a></li> 
    366 <li><a class="reference" href="#avantages-inconv-nients" id="id5" name="id5">Avantages / Inconvénients</a></li> 
    367 <li><a class="reference" href="#frameworks-haut-niveau" id="id6" name="id6">Frameworks haut niveau</a></li> 
    368 <li><a class="reference" href="#django" id="id7" name="id7">Django</a></li> 
    369 <li><a class="reference" href="#turbogears" id="id8" name="id8">TurboGears</a></li> 
    370 <li><a class="reference" href="#zope" id="id9" name="id9">Zope</a></li> 
    371 <li><a class="reference" href="#grok" id="id10" name="id10">Grok</a></li> 
    372 <li><a class="reference" href="#id1" id="id11" name="id11">Avantages / Inconvénients</a></li> 
    373 <li><a class="reference" href="#probl-matique-de-d-ploiement" id="id12" name="id12">Problématique de déploiement</a></li> 
    374 <li><a class="reference" href="#utilisation-de-virtualenv" id="id13" name="id13">Utilisation de virtualenv</a></li> 
    375 <li><a class="reference" href="#utilisation-de-zc-buildout" id="id14" name="id14">Utilisation de zc.buildout</a></li> 
    376 <li><a class="reference" href="#b-tir-son-application" id="id15" name="id15">Bâtir son application</a></li> 
    377 <li><a class="reference" href="#utilisation-de-distutils" id="id16" name="id16">Utilisation de distutils</a></li> 
    378 <li><a class="reference" href="#wsgi-vous-sauve-la-vie" id="id17" name="id17">WSGI vous sauve la vie</a></li> 
    379 <li><a class="reference" href="#composition" id="id18" name="id18">Composition</a></li> 
    380 <li><a class="reference" href="#en-image" id="id19" name="id19">En image</a></li> 
    381 <li><a class="reference" href="#serveur" id="id20" name="id20">Serveur</a></li> 
    382 <li><a class="reference" href="#application" id="id21" name="id21">Application</a></li> 
    383 <li><a class="reference" href="#la-variable-environ-1-2" id="id22" name="id22">La variable environ (1/2)</a></li> 
    384 <li><a class="reference" href="#la-variable-environ-2-2" id="id23" name="id23">La variable environ (2/2)</a></li> 
    385 <li><a class="reference" href="#monde-du-milieu-1-2" id="id24" name="id24">Monde du milieu (1/2)</a></li> 
    386 <li><a class="reference" href="#monde-du-milieu-2-2" id="id25" name="id25">Monde du milieu (2/2)</a></li> 
    387 <li><a class="reference" href="#une-implementation-paste" id="id26" name="id26">Une implementation: Paste</a></li> 
    388 <li><a class="reference" href="#configuration-de-type-ini" id="id27" name="id27">Configuration de type INI</a></li> 
    389 <li><a class="reference" href="#factory-1-2" id="id28" name="id28">Factory (1/2)</a></li> 
    390 <li><a class="reference" href="#factory-2-2" id="id29" name="id29">Factory (2/2)</a></li> 
    391 <li><a class="reference" href="#une-application-simple" id="id30" name="id30">Une application simple</a></li> 
    392 <li><a class="reference" href="#l-ments-de-configuration-1-2" id="id31" name="id31">Éléments de configuration (1/2)</a></li> 
    393 <li><a class="reference" href="#id2" id="id32" name="id32">Éléments de configuration (1/2)</a></li> 
    394 <li><a class="reference" href="#les-frameworks" id="id33" name="id33">Les frameworks</a></li> 
    395 <li><a class="reference" href="#en-savoir-plus" id="id34" name="id34">En savoir plus</a></li> 
    396 <li><a class="reference" href="#ils-nous-soutiennent" id="id35" name="id35">Ils nous soutiennent</a></li> 
    397 <li><a class="reference" href="#questions" id="id36" name="id36">Questions ?</a></li> 
     365<li><a class="reference" href="#exemple-web-py" id="id4" name="id4">Exemple web.py</a></li> 
     366<li><a class="reference" href="#pylons" id="id5" name="id5">Pylons</a></li> 
     367<li><a class="reference" href="#avantages-inconv-nients" id="id6" name="id6">Avantages / Inconvénients</a></li> 
     368<li><a class="reference" href="#frameworks-haut-niveau" id="id7" name="id7">Frameworks haut niveau</a></li> 
     369<li><a class="reference" href="#django" id="id8" name="id8">Django</a></li> 
     370<li><a class="reference" href="#turbogears" id="id9" name="id9">TurboGears</a></li> 
     371<li><a class="reference" href="#zope" id="id10" name="id10">Zope</a></li> 
     372<li><a class="reference" href="#grok" id="id11" name="id11">Grok</a></li> 
     373<li><a class="reference" href="#id1" id="id12" name="id12">Avantages / Inconvénients</a></li> 
     374<li><a class="reference" href="#probl-matique-d-ploiement" id="id13" name="id13">Problématique déploiement</a></li> 
     375<li><a class="reference" href="#utilisation-de-virtualenv" id="id14" name="id14">Utilisation de virtualenv</a></li> 
     376<li><a class="reference" href="#utilisation-de-zc-buildout" id="id15" name="id15">Utilisation de zc.buildout</a></li> 
     377<li><a class="reference" href="#b-tir-son-application" id="id16" name="id16">Bâtir son application</a></li> 
     378<li><a class="reference" href="#utilisation-de-distutils" id="id17" name="id17">Utilisation de distutils</a></li> 
     379<li><a class="reference" href="#les-points-d-entr-es" id="id18" name="id18">Les points d'entrées</a></li> 
     380<li><a class="reference" href="#wsgi-vous-sauve-la-vie" id="id19" name="id19">WSGI vous sauve la vie</a></li> 
     381<li><a class="reference" href="#composition" id="id20" name="id20">Composition</a></li> 
     382<li><a class="reference" href="#en-image" id="id21" name="id21">En image</a></li> 
     383<li><a class="reference" href="#application" id="id22" name="id22">Application</a></li> 
     384<li><a class="reference" href="#existant" id="id23" name="id23">Existant</a></li> 
     385<li><a class="reference" href="#la-variable-environ-1-2" id="id24" name="id24">La variable environ (1/2)</a></li> 
     386<li><a class="reference" href="#la-variable-environ-2-2" id="id25" name="id25">La variable environ (2/2)</a></li> 
     387<li><a class="reference" href="#monde-du-milieu-1-2" id="id26" name="id26">Monde du milieu (1/2)</a></li> 
     388<li><a class="reference" href="#monde-du-milieu-2-2" id="id27" name="id27">Monde du milieu (2/2)</a></li> 
     389<li><a class="reference" href="#id2" id="id28" name="id28">Existant</a></li> 
     390<li><a class="reference" href="#une-implementation-paste" id="id29" name="id29">Une implementation: Paste</a></li> 
     391<li><a class="reference" href="#configuration-de-type-ini" id="id30" name="id30">Configuration de type INI</a></li> 
     392<li><a class="reference" href="#une-application-simple" id="id31" name="id31">Une application simple</a></li> 
     393<li><a class="reference" href="#les-frameworks" id="id32" name="id32">Les frameworks</a></li> 
     394<li><a class="reference" href="#en-savoir-plus" id="id33" name="id33">En savoir plus</a></li> 
     395<li><a class="reference" href="#remerciements" id="id34" name="id34">Remerciements</a></li> 
     396<li><a class="reference" href="#questions" id="id35" name="id35">Questions ?</a></li> 
    398397</ul> 
    399398</div> 
     
    404403<ul class="simple"> 
    405404<li>web.py</li> 
     405<li>cherrypy</li> 
    406406<li>WebOb</li> 
    407407<li>Paste</li> 
     
    409409</ul> 
    410410</div> 
    411 <div class="slide" id="exemple-de-hello-world"> 
    412 <h1>Exemple de Hello World</h1> 
     411<div class="slide" id="exemple-web-py"> 
     412<h1>Exemple web.py</h1> 
    413413<blockquote> 
    414414<pre class="literal-block"> 
     
    429429</blockquote> 
    430430</div> 
     431<div class="slide" id="pylons"> 
     432<h1>Pylons</h1> 
     433<p>La commande:</p> 
     434<pre class="literal-block"> 
     435$ paster controller hello 
     436</pre> 
     437<p>Devient:</p> 
     438<pre class="literal-block"> 
     439class HelloController(BaseController): 
     440 
     441  def index(self): 
     442    return 'Hello' 
     443</pre> 
     444</div> 
    431445<div class="slide" id="avantages-inconv-nients"> 
    432446<h1>Avantages / Inconvénients</h1> 
     
    447461<div class="slide" id="django"> 
    448462<h1>Django</h1> 
    449 <p>Framework complet intégrant une interface d'administration pré-mâchée.</p> 
     463<p>Framework complet intégrant une interface 
     464d'administration pré-mâchée.</p> 
    450465</div> 
    451466<div class="slide" id="turbogears"> 
     
    464479<h1>Avantages / Inconvénients</h1> 
    465480<ul class="simple"> 
    466 <li>prise en main lente (voir très lente)</li> 
     481<li>prise en main lente (voire très lente)</li> 
    467482<li>nombreuses briques existantes</li> 
    468483</ul> 
    469484</div> 
    470 <div class="slide" id="probl-matique-de-d-ploiement"> 
    471 <h1>Problématique de déploiement</h1> 
     485<div class="slide" id="probl-matique-d-ploiement"> 
     486<h1>Problématique déploiement</h1> 
    472487<ul class="simple"> 
    473488<li>Environnements de développement</li> 
    474489<li>Bâtir son application</li> 
    475 <li>Utilisation de plusieurs framework.</li> 
    476 <li>Cohabitation entre ces framework.</li> 
    477 <li>Partage de code entre les application.</li> 
     490<li>Utilisation de plusieurs frameworks.</li> 
     491<li>Cohabitation entre ces frameworks.</li> 
     492<li>Partage de code entre les applications.</li> 
    478493</ul> 
    479494</div> 
     
    484499$ virtualenv --no-site-packages monprojet 
    485500</pre> 
    486 <p>Nouveaux binaires python</p> 
     501<p>=&gt; Nouveaux binaires python</p> 
    487502</div> 
    488503<div class="slide" id="utilisation-de-zc-buildout"> 
     
    501516  mon.app 
    502517</pre> 
     518<p>=&gt; Modification du PYTHON_PATH</p> 
    503519</div> 
    504520<div class="slide" id="b-tir-son-application"> 
     
    518534<p>Release:</p> 
    519535<pre class="literal-block"> 
    520 $ python setup.py sdist bdist_egg register upload 
    521 </pre> 
     536$ python setup.py sdist bdist_egg 
     537                  register upload 
     538</pre> 
     539</div> 
     540<div class="slide" id="les-points-d-entr-es"> 
     541<h1>Les points d'entrées</h1> 
     542<blockquote> 
     543<pre class="literal-block"> 
     544entry_points = &quot;&quot;&quot; 
     545[console_scripts] 
     546buildout = zc.buildout.buildout:main 
     547 
     548[super_points] 
     549... 
     550&quot;&quot;&quot; 
     551</pre> 
     552</blockquote> 
    522553</div> 
    523554<div class="slide" id="wsgi-vous-sauve-la-vie"> 
     
    544575</div> 
    545576</div> 
    546 <div class="slide" id="serveur"> 
    547 <h1>Serveur</h1> 
    548 <p>Il est chargé de desservir les pages web.</p> 
    549 <ul class="simple"> 
    550 <li>PasteDeploy</li> 
    551 <li>mod_python</li> 
    552 <li>Flup (fastcgi)</li> 
    553 </ul> 
    554 </div> 
    555577<div class="slide" id="application"> 
    556578<h1>Application</h1> 
     
    559581def application(environ, start_response): 
    560582    start_response('200 OK', 
    561                    [('Content-Type', 'text/html')]) 
     583            [('Content-Type', 'text/html')]) 
    562584    return ['Hello'] 
    563585</pre> 
     586</div> 
     587<div class="slide" id="existant"> 
     588<h1>Existant</h1> 
     589<ul class="simple"> 
     590<li>paste</li> 
     591<li>Pylons</li> 
     592<li>Zope</li> 
     593<li>Django</li> 
     594<li>...</li> 
     595</ul> 
    564596</div> 
    565597<div class="slide" id="la-variable-environ-1-2"> 
     
    569601<li>Contient l'environnement pour une requête</li> 
    570602<li>Valeurs d'un environnement HTTP classique (PATH_INFO, HTTP_HOST, etc.)</li> 
    571 <li>Valeurs spécifique à la norme (wsgi.*)</li> 
     603<li>Valeurs spécifiques à la norme (wsgi.*)</li> 
    572604</ul> 
    573605</div> 
     
    575607<h1>La variable environ (2/2)</h1> 
    576608<ul class="simple"> 
    577 <li>wsgi.version</li> 
    578609<li>wsgi.url_scheme http / https</li> 
    579610<li>wsgi.input Flux d'entrée en lecture contenant la requête (stdin)</li> 
    580611<li>wsgi.errors Flux de sortie permettant de tracer les erreurs. (stderr)</li> 
    581 <li>wsg.multithread Vrai / Faux</li> 
    582 <li>wsgi.multiprocess Vrai / Faux</li> 
    583612<li>wsgi.run_once Vrai si l'application n'est évaluée qu'une fois dans la vie 
    584613du processus. (CGI / Tests)</li> 
     
    587616<div class="slide" id="monde-du-milieu-1-2"> 
    588617<h1>Monde du milieu (1/2)</h1> 
    589 <p>Interagis à la fois avec l'application et avec le serveur.</p> 
     618<p>Interagit à la fois avec l'application et avec le serveur.</p> 
    590619<ul class="simple"> 
    591620<li>modifie le comportement d'une application</li> 
     
    613642</pre> 
    614643</div> 
     644<div class="slide" id="id2"> 
     645<h1>Existant</h1> 
     646<ul class="simple"> 
     647<li>Authkit</li> 
     648<li>Beacker</li> 
     649<li>iw.thumbs</li> 
     650<li>...</li> 
     651</ul> 
     652</div> 
    615653<div class="slide" id="une-implementation-paste"> 
    616654<h1>Une implementation: Paste</h1> 
    617 <blockquote> 
    618 <p>Ensemble de librairie implementant la norme</p> 
    619 <ul class="simple"> 
    620 <li>Serveurs</li> 
    621 <li>Squelette d'application</li> 
    622 <li>Composants du milieu réutilisable</li> 
    623 </ul> 
    624 </blockquote> 
     655<ul class="simple"> 
     656<li>Ensemble de librairies 
     657implémentant la norme</li> 
     658</ul> 
    625659</div> 
    626660<div class="slide" id="configuration-de-type-ini"> 
    627661<h1>Configuration de type INI</h1> 
    628 <blockquote> 
    629 <ul class="simple"> 
    630 <li>Configuration organisée en section</li> 
    631 <li>Enchaînement de sections: serveur -&gt; millieu(s) -&gt; application(s)</li> 
    632 <li>Configurable par un administrateur sans notion de python ni de developement.</li> 
    633 </ul> 
    634 </blockquote> 
    635 </div> 
    636 <div class="slide" id="factory-1-2"> 
    637 <h1>Factory (1/2)</h1> 
    638 <blockquote> 
    639 <ul class="simple"> 
    640 <li>Utilisation de points d'entrées pointant vers des factory</li> 
    641 <li>Le factory renvois l'application après une éventuelle configuration</li> 
    642 </ul> 
    643 </blockquote> 
    644 </div> 
    645 <div class="slide" id="factory-2-2"> 
    646 <h1>Factory (2/2)</h1> 
    647 <p>Factory avec configuration:</p> 
    648 <pre class="literal-block"> 
    649 def mon_application(global_config, 
    650                     **local_config): 
    651     # on utilise le factory 
    652     #pour configurer la notification 
    653     app = ErrorHandler(application, 
    654                        local_config['email']) 
    655     return app 
    656 </pre> 
     662<ul class="simple"> 
     663<li>Configuration organisée en sections</li> 
     664<li>Configurable par un administrateur 
     665sans notion de python ni de developement.</li> 
     666</ul> 
    657667</div> 
    658668<div class="slide" id="une-application-simple"> 
     
    673683paster serve deploy.ini 
    674684</pre> 
    675 </div> 
    676 <div class="slide" id="l-ments-de-configuration-1-2"> 
    677 <h1>Éléments de configuration (1/2)</h1> 
    678 <p>app: une application:</p> 
    679 <pre class="literal-block"> 
    680 [app:mon_application] 
    681 use = egg:mon.package#ma_super_application 
    682 </pre> 
    683 <p>filter: monde du milieu:</p> 
    684 <pre class="literal-block"> 
    685 [filter:error_handler] 
    686 use = egg:mon.package#error_handler 
    687 </pre> 
    688 <p>pipeline: permet un enchaînement monde du milieu / application:</p> 
    689 <pre class="literal-block"> 
    690 [pipeline:main] 
    691 pipeline = error_handler mon_application 
    692 </pre> 
    693 </div> 
    694 <div class="slide" id="id2"> 
    695 <h1>Éléments de configuration (1/2)</h1> 
    696 <p>composite: permet de combiner des applications:</p> 
    697 <pre class="literal-block"> 
    698 [composite:main] 
    699 use = Paste#urlmap 
    700 /app1 = mon_application 
    701 /app2 = mon_application2 
    702 </pre> 
    703 <p>server: permet un choix de serveur:</p> 
    704 <pre class="literal-block"> 
    705 [server:main] 
    706 use = PasteScript#cherrypy 
    707 host = 127.0.0.1 
    708 port = 5000 
    709 </pre> 
    710 <p>Paste utilise les sections :main comme point d'entrée puis construit 
    711 l'application</p> 
    712685</div> 
    713686<div class="slide" id="les-frameworks"> 
     
    726699<h1>En savoir plus</h1> 
    727700<ul class="simple"> 
    728 <li>pipy - <a class="reference" href="http://pypi.python.org">http://pypi.python.org</a></li> 
     701<li>pypi - <a class="reference" href="http://pypi.python.org">http://pypi.python.org</a></li> 
    729702<li>PEP333 - <a class="reference" href="http://www.python.org/dev/peps/pep-0333/">http://www.python.org/dev/peps/pep-0333/</a></li> 
    730703<li>wsgi.org - <a class="reference" href="http://wsgi.org/wsgi">http://wsgi.org/wsgi</a></li> 
    731704</ul> 
    732705</div> 
    733 <div class="slide" id="ils-nous-soutiennent"> 
    734 <h1>Ils nous soutiennent</h1> 
    735 <p>Logilab - <a class="reference" href="http://logilab.com">http://logilab.com</a></p> 
    736 <p>Nerim - <a class="reference" href="http://www.nerim.fr">http://www.nerim.fr</a></p> 
    737 <p>Ingeniweb - <a class="reference" href="http://www.ingeniweb.com">http://www.ingeniweb.com</a></p> 
     706<div class="slide" id="remerciements"> 
     707<h1>Remerciements</h1> 
     708<ul class="simple"> 
     709<li>Logilab - <a class="reference" href="http://logilab.com">http://logilab.com</a></li> 
     710<li>Nerim - <a class="reference" href="http://www.nerim.fr">http://www.nerim.fr</a></li> 
     711<li>Ingeniweb - <a class="reference" href="http://www.ingeniweb.com">http://www.ingeniweb.com</a></li> 
     712</ul> 
    738713</div> 
    739714<div class="slide" id="questions">