Création d'images dynamiques avec WSGI, aucun fichier impliqué
-
05-07-2019 - |
Question
Je souhaite envoyer à mes utilisateurs des images créées dynamiquement, telles que des graphiques, des graphiques, etc. Ces images sont "jetables". images, elles ne seront envoyées qu'à un seul utilisateur, puis détruites, d'où le libellé "Aucun fichier en cause".
Je souhaite envoyer l'image directement à l'utilisateur, sans l'enregistrer au préalable sur le système de fichiers. Avec PHP, vous pouvez associer une image de vos fichiers HTML à un script PHP tel que:
edit: SO a avalé mon tag d'image:
<img src="someScript.php?param1=xyz">
Le script a ensuite envoyé les en-têtes appropriés (filetype = & jteg, etc.) au navigateur et a directement écrit l'image sur le client, sans l'enregistrer temporairement dans le système de fichiers.
Comment pourrais-je faire quelque chose comme ceci avec une application WSGI. Actuellement, j'utilise le serveur interne SimpleWSGI de Python. Je suis conscient du fait que ce serveur était principalement destiné à des fins de démonstration et non à une utilisation réelle, car il ne dispose pas de fonctionnalités de multi-threading, veuillez donc ne pas me le signaler, je suis conscient de cela et, pour l'instant, il répond à mes exigences: )
Est-ce vraiment aussi simple que de placer l'URL dans les balises d'image et de traiter la requête avec WSGI, ou existe-t-il une meilleure pratique?
Quelqu'un at-il déjà eu une expérience avec cela et pourrait me donner quelques indications (pas d’affichage 32 bits s'il vous plaît)
Merci,
Tom
La solution
Cela n’est pas lié à WSGI, à php ou à toute autre technologie Web spécifique. considérer
<img src="someScript.php?param1=xyz">
en général pour l'URL someScript.php? param1 = xyz
le serveur devrait renvoyer des données de type image et cela fonctionnerait
Considérez cet exemple:
from wsgiref.simple_server import make_server
def serveImage(environ, start_response):
status = '200 OK'
headers = [('Content-type', 'image/png')]
start_response(status, headers)
return open("about.png", "rb").read()
httpd = make_server('', 8000, serveImage)
httpd.serve_forever()
ici, toute URL pointant sur serveImage retournera une image valide et vous pourrez l’utiliser dans n’importe quelle balise img
ou tout autre emplacement de balise où une image peut être utilisée, par exemple. css ou images de fond
Les données d'images peuvent être générées à la volée à l'aide de nombreuses bibliothèques tierces, par exemple. PIL etc. par exemple, voir des exemples de génération d'images dynamiques à l'aide de la bibliothèque d'imagerie Python http://lost-theory.org/python/dynamicimg.html
Autres conseils
OUI. C’est aussi simple que de mettre l’URL dans la page.
<img src="url_to_my_application">
Et votre application doit simplement la renvoyer avec le type MIME correct, comme pour PHP ou autre. Exemple le plus simple possible:
def application(environ, start_response):
data = open('test.jpg', 'rb').read() # simulate entire image on memory
start_response('200 OK', [('content-type': 'image/jpeg'),
('content-length', str(len(data)))])
return [data]
Bien sûr, si vous utilisez une bibliothèque framework / helper, celle-ci peut avoir des fonctions d'assistance qui vous faciliteront la tâche.
J'aimerais ajouter en commentaire que les fonctionnalités de multi-threading ne sont pas essentielles sur un serveur Web. Si cela est fait correctement, vous n’avez pas besoin de threads pour obtenir de bonnes performances.
Si vous avez une boucle d'événement bien développée qui permute entre différentes requêtes et écrit votre code de traitement des requêtes sans threads (en rendant le contrôle au serveur aussi souvent que possible), vous pouvez obtenir même de meilleures performances qu'avec les threads, car rien ne les rend plus rapides et ne crée pas de surcharge.
Voir twisted.web pour une bonne implémentation de serveur Web python n'utilisant pas de threads .
Pour un exemple sophistiqué utilisant cette technique, veuillez consulter la voie ferrée BNF diagramme mini-démo WHIFF . Vous pouvez obtenir le code source à partir du téléchargement de la boîte à outils WHIFF wsgi.
Vous devriez envisager d'utiliser et de prêter attention aux en-têtes ETag. C'est un script CGI, pas WSGI, mais les idées peuvent être traduites: source de sparklines source - it arrive à toujours retourner la même image pour les mêmes paramètres, de sorte qu'il pratique la mise en cache extrême.