Apprendre à utiliser le Framework webware pour Python
Apprendre à utiliser le Framework webware pour Python
...
Qu'est-ce qu'un Webware?
Orienté python
Orienté objet
Couvrir les besoins communs des développeurs Web
Architecture modulaire: les composants peuvent facilement être utilisés ensemble ou indépendamment
Excellente documentation et exemples
Développement Open Source et communauté
Licence de style python
Multiplate-forme; fonctionne aussi bien sur:
Unix dans ses multiples saveurs
Windows NT / 2000 / XP
Qu'est-ce qu'il y a dans le Webware?
Le coeur du Webware est WebKit
Nous couvrirons également:
Pages du serveur Python (PSP)
TaskKit
MiddleKit
UserKit
WebKit
Un serveur d'applications rapide et facile à utiliser
Multi-threading, pas de fourche
Facilite les données persistantes
Fonctionne bien sur Windows
Stable et mature
Utilisé dans plusieurs projets commerciaux réels
Prend en charge plusieurs styles de développement:
Servlets
Pages du serveur Python
...
Installation de Webware
Télécharger
La dernière version officielle peut être téléchargée à partir de
http://webware.sourceforge.net/
Ou utilisez CVS pour attirer de nouvelles sources
Installer
Décompressez l'archive, créant un répertoire Webware
Exécutez python install.py dans le répertoire Webware
Directeur de travail
Vous pouvez exécuter WebKit directement à partir du répertoire d'installation.
Mais il est facile de créer un répertoire de travail séparé.
Avantages:
Conserve la configuration, les journaux, les caches, les servlets, etc. séparément du répertoire Webware
Vous permet d'exécuter plusieurs instances de WebKit sans avoir à créer plusieurs copies de Webware.
Facilite la mise à jour du Webware, car vous n’avez pas à le modifier.
Répertoire de travail continué
Comment faire:
python bin / MakeAppWorkDir.py / path / to / workdir
Cela crée cette structure de répertoire: rép_travail / cache / utilisé par Webware
Canettes / ???
Configs / Application.config les éditer pour modifier votre configuration
AppServer.config
ErrorMsgs / Webware enregistre les messages d'erreur ici
Journaux / Webware stocke les journaux ici
Le contexte MyContext / Sample est placé ici; vous pouvez le modifier pour créer votre application
Les sessions / données de session sont stockées ici
AppServer démarre AppServer sous Unix
AppServer.bat Démarre le serveur AppServer sous Windows.
Launch.py Utilisé par AppServer [.bat]
NTService.py Version du service Windows NT / 2000 d’AppServer
WebKit.cgi Installer dans votre répertoire cgi-bin
OneShot.cgi Installez-le dans votre répertoire cgi-bin pour utiliser le mode One-Shot
WebKit.cgi
Facile à installer
Devrait fonctionner avec n'importe quel serveur Web prenant en charge CGI
À installer:
Copiez WebKit.cgi de votre répertoire de travail (et non du répertoire d’installation de Webware) dans le répertoire cgi-bin de votre serveur Web.
Sous Windows, vous devrez probablement changer la première ligne
de WebKit.cgi à partir de
#! / usr / bin / env python
à
#! C: \ Python22 \ python.exe (ou où que soit installé Python…)
mod_webkit
Module Apache personnalisé pour Webware écrit en C
Beaucoup plus rapide que WebKit.cgi:
Ne doit pas démarrer l'interpréteur Python à chaque requête
Situé dans Webware / WebKit / Native / mod_webkit
Sous Unix:
utiliser make et make install
Sous Windows:
Téléchargez le fichier mod_webkit.dll précompilé à partir de http://webware.sourceforge.net/MiscDownloads/
Placez mod_webkit.dll dans le répertoire Apache / modules mod_webkit suite
Editez votre fichier httpd.conf Apache:
# Charge le module mod_webkit
# Sous Windows, vous utiliseriez mod_webkit.dll au lieu de mod_webkit.so
LoadModule webkit_module modules / mod_webkit.so
AddModule mod_webkit.c
# Incluez ceci si vous voulez envoyer tous les fichiers .psp à WebKit,
# même ceux qui ne se trouvent pas dans un contexte WebKit configuré.
AddType text / psp .psp
AddHandler psp-handler .psp
# Ceci envoie des demandes pour / webkit / ... au serveur d'applications sur le port 8086.
WKServer localhost 8086
SetHandler gestionnaire de webkit
Démarrer le serveur d'applications
Dans votre répertoire de travail, exécutez:
Unix: ./AppServer
Windows: AppServer.bat
Utilisation des exemples de servlets et des PSP
Pour utiliser l'adaptateur CGI, surfez sur:
http: //localhost/cgi-bin/WebKit.cgi
Pour utiliser l'adaptateur mod_webkit, surfez sur:
http: // localhost / webkit
Expérimentez et amusez-vous!
Servlets
Une classe Python située dans un module du même nom
Doit hériter de WebKit.Servlet ou de l'une de ses sous-classes:
WebKit.HTTPServlet
WebKit.Page
Une technique courante consiste à créer votre propre sous-classe de WebKit.Page appelée SitePage qui contiendra:
Méthodes utilitaires
Remplacements du comportement par défaut dans WebKit.Page
La servlet la plus simple:
depuis la page d'importation WebKit.Page
classe HelloWorld (Page):
def writeContent (self):
self.writeln ('Hello, World!')
Les contextes
Les servlets sont situés dans les contextes
Un contexte est un paquet Python
Comme un paquet Python, il contient un module __init__.py qui:
Est importé avant l'exécution de servlets
Est-ce un bon endroit pour mettre le code d'initialisation global
S'il contient une fonction contextInitialize, alors contextInitialize (application, path_of_context) est appelé.
Application.config contient les paramètres qui mappent
URL vers les contextes
Il est préférable de placer les modules d’assistance non-servlet dans un package séparé, au lieu de les placer dans le package contextuel.
Le cycle demande-réponse
L'utilisateur lance une demande:
http: // localhost / webkit / MyContext / MyServlet
Cela active le contexte MyContext et le servlet MyServlet en fonction des paramètres définis dans Application.config.
Remarque: aucune extension n'a été spécifiée, même si le fichier s'appelle MyServlet.py.
Application.config contient plusieurs paramètres qui contrôlent le traitement des extensions.
Une instance de la classe MyServlet est extraite d'un pool d'instances MyServlet. OU si le pool est vide, une nouvelle instance MyServlet est créée.
Un objet de transaction est créé.
Ces méthodes sont appelées sur l'instance MyServlet:
Servlet.awake (transaction)
Servlet.respond (transaction)
Servlet.sleep (transaction)
L'instance MyServlet est renvoyée dans son pool d'instances.
L'objet de transaction
Regroupe plusieurs objets impliqués dans le traitement d'une requête:
Requête: contient les données reçues de l'utilisateur
Réponse: contient les en-têtes et le texte de la réponse
Servlet: traite la demande et renvoie le résultat dans la
Réponse
Session: contient des données côté serveur indexées par un cookie
Peut également utiliser une variable intégrée à l'URL
Application: l'objet contrôleur global
Vous utilisez rarement l'objet de transaction directement
HTTPRequest
Dérivé de la classe de base de demande générique
Contient les données envoyées par le navigateur:
Variables GET et POST:
.field (nom, [valeur par défaut])
.hasField (nom)
.des champs()
Biscuits:
.cookie (nom, [défaut])
.hasCookie (nom)
.biscuits()
Si vous ne voulez pas savoir s’il s’agit d’un champ ou d’un cookie:
.value (nom, [valeur par défaut])
.hasValue (nom)
.valeurs()
Variables d'environnement CGI
Différentes formes de l'URL
Chemins côté serveur
etc.
HTTPResponse
Dérivé de la classe de base de réponse générique
Contient les données renvoyées au navigateur
.write (text) - envoie une réponse textuelle au navigateur
Normalement, tout le texte est accumulé dans une mémoire tampon, puis envoyé en une fois à la fin du traitement de la servlet.
.setHeader (name, value) - définit un en-tête HTTP
.flush () - efface tous les en-têtes et le texte accumulé; utilisé pour:
Streaming gros fichiers
Affichage des résultats partiels pour les servlets lents
.sendRedirect (url) - définit les en-têtes HTTP pour une redirection
Page: Méthodes de commodité
Accès à la transaction et à ses objets:
.transaction (), .reponse (), .request (), .session (), .application ()
Écrire des données de réponse:
.write () - équivalent à .response (). write ()
.writeln () - ajoute une nouvelle ligne à la fin
Méthodes d'utilité:
.htmlEncode ()
.urlEncode ()
Passer le contrôle à un autre servlet:
.vers l'avant()
.includeURL ()
.callMethodOfServlet ()
Quoi que vous choisissiez d'ajouter à votre page de site
Page: Méthodes appelées lors d'une demande
.respond () appelle généralement .writeHTML ()
Remplacez .writeHTML () dans votre servlet si vous voulez que votre servlet fournisse la sortie complète
Mais par défaut, .writeHTML () appelle une séquence commode d’appels de méthodes:
.writeDocType () - substitue ceci si vous ne voulez pas utiliser
HTML 4.01 Transitional
.writeln ('')
.writeHead ()
.writeBody ()
.writeln ('')
Page: .writeHead ()
Appels .writeHead ():
.write ('')
.writeHeadParts () qui appelle elle-même:
.writeTitle ()
Fournissez un .title () dans votre servlet qui renvoie le titre souhaité.
Sinon, le titre sera le nom de votre classe de servlet
.writeStyleSheet () - substitue si vous utilisez des feuilles de style
.write ('')
Page: .writeBody ()
Appels .writeBody ():
.write ('<body% s>'% self.htBodyArgs ())
écrasez .htBodyArgs () si vous devez fournir des arguments à la balise
.writeBodyParts () qui appelle elle-même:
.writeContent ()
généralement c'est ce que vous allez remplacer dans vos servlets ou votre SitePage
.write ('')
actes
Les actions permettent d’associer différents boutons de soumission de formulaire à différentes méthodes de servlet.
Pour utiliser des actions:
Ajoutez des boutons de soumission comme celui-ci à un formulaire:
Widget ”>
Fournissez une méthode .actions () qui renvoie la liste des noms de méthodes:
actions def (auto):
retourne ['ajouter', 'supprimer']
.respond () recherche un champ _action_ACTIONNAME où ACTIONNAME est dans la liste renvoyée par .actions ()
Si un tel champ est trouvé, alors .handleAction () est appelé à la place de .writeHTML ()
Actions continuées
Appels .handleAction ():
.preAction (ACTIONNAME) qui appelle elle-même:
.writeDocType ()
.writeln ('')
.writeHead ()
.ACTIONNAME ()
.postAction (ACTIONNAME) qui lui-même appelle:
.writeln ('')
En d'autres termes, votre méthode d'action est appelée à la place de .writeContent ()
Bien sûr, vous n’avez pas à utiliser d’actions; vous pouvez simplement écrire du code dans votre writeContent qui examine l'objet HTTPResponse et agit en conséquence.
Expéditeur
auto.forward ('AnotherServlet')
Analogue à une redirection effectuée entièrement dans WebKit
Regrouper la demande actuelle dans une nouvelle transaction
Transmet cette transaction au cycle normal RequestResponse avec le servlet indiqué
Lorsque ce servlet est terminé, le contrôle retourne au servlet appelant, mais tout le texte de réponse et les en-têtes du servlet appelant sont ignorés.
Utile pour l'implémentation d'un servlet «contrôleur» qui examine la demande et la transmet à un autre servlet pour traitement.
Jusqu'à récemment, vous deviez écrire:
self.application (). forward (self.transaction (), 'AnotherServlet')
Comprenant
self.includeURL (‘AnotherServlet’)
Similaire à .forward (), sauf que la sortie du servlet appelé est incluse dans la réponse, au lieu de la remplacer.
Jusqu'à récemment, vous deviez écrire:
self.application (). includeURL (self.transaction (), ‘AnotherServlet’)
Appeler des méthodes de servlet
self.callMethodOfServlet ('AnotherServlet', 'méthode', arg1, arg2,…)
Instancie le servlet indiqué
Appelle servlet.awake ()
Appelle la méthode indiquée avec les arguments indiqués
Appelle servlet.sleep ()
Renvoie la valeur de retour de l'appel de méthode au servlet appelant.
Exemple: supposons que vous ayez une servlet de table des matières qui doit extraire le titre d'autres servlets en appelant la méthode .title () sur ces servlets:
title = self.callMethodOfServlet (nom du servlet, 'titre')
Sessions
Stocker les données spécifiques à l'utilisateur qui doivent persister d'une requête à l'autre
Les sessions expirent après un certain nombre de minutes d'inactivité
Contrôlé à l'aide de la variable de configuration SessionTimeout
L'interface habituelle:
.value (nom, [valeur par défaut])
.hasValue (nom)
.valeurs()
.setValue (nom, valeur)
Magasins de session
Trois options pour la variable de configuration SessionStore:
Mémoire - toutes les sessions sont gardées en mémoire
Dynamique - les sessions récemment utilisées sont conservées en mémoire, mais les sessions qui n’ont pas été utilisées depuis un moment sont transférées sur le disque et supprimées de la mémoire.
C'est la valeur par défaut, et c'est recommandé.
Fichier - les sessions sont décochées sur le disque et décodées du disque à chaque demande et ne sont pas du tout stockées en mémoire.
Non recommandé.
Toutes les sessions sont décochées sur le disque lorsque le serveur d'applications est arrêté et désélectionnées au démarrage du serveur d'applications.
Vous pouvez redémarrer le serveur d'applications sans perdre de sessions.
Options de session
Les sessions sont associées à un identifiant de session aléatoire
Par défaut, l'ID de session est stocké dans un cookie.
Alternative: définissez UseAutomaticPathSessions sur 1
L'identifiant de session est automatiquement intégré en tant que composant de l'URL
Cookies non requis
Mais: les URL deviennent beaucoup plus longues et plus laides
Pas moyen (encore) que WebKit choisisse la stratégie appropriée en fonction de la prise en charge par le navigateur des cookies PSP: Python Server Pages
Mélangez Python et HTML dans le style de JSP ou ASP
Inclure le code en utilisant <%…%>
Inclure les expressions évaluées à l'aide de <% =…%>
Commencez un bloc en terminant le code avec deux points:
<% pour I dans la plage (10):%>
Terminez un bloc en utilisant la balise spéciale: <% end%>
Lorsque l'utilisateur demande une PSP:
Il est automatiquement compilé dans une classe de servlet dérivée de WebKit.Page
Le corps de votre PSP est traduit en une méthode writeHTML ()
Exemple PSP
<%
def isprime (nombre):
si numéro == 2:
retour 1
si nombre <= 1:
retourne 0
pour i dans la plage (2, nombre / 2):
pour j dans la plage (2, i + 1):
si i * j == nombre:
retourne 0
retour 1
%>
Voici quelques chiffres, qu'ils soient premiers ou non:
<% pour i dans la plage (1, 101):%>
<% si isprime (i):%>
<% = i%> est premier!
<% end%> <% else:%>
<% = i%> n'est pas premier.
<% end%>
<% end%>
