Html /css avec python

Résolu/Fermé
rose2022 Messages postés 20 Date d'inscription vendredi 21 octobre 2022 Statut Membre Dernière intervention 22 novembre 2022 - Modifié le 16 nov. 2022 à 15:33
rose2022 Messages postés 20 Date d'inscription vendredi 21 octobre 2022 Statut Membre Dernière intervention 22 novembre 2022 - 22 nov. 2022 à 01:10

Bonsoir 

svp autant que débutante en python j'ai besoin d'aide svp

mon projet : création de chatroom sécurisé entre plusieurs utilisateurs .

mon probléme : coté client : :j'ai crée une page html (login  et inscription) dans un script python et je n'arrive pas a le mètre en forme avec css.

ce que j'ai fait : ajout d'hyperlien a l'entête Head mais ca fonctionne pas ?

 <link rel="stylesheet" href="file:///C|/Users\\USER\PycharmProjects\chatroom/style.css" media="screen" type="text/css" />

voici le code :

server.py :

 
import http.server

PORT = 80
server_address = ("", PORT)

server = http.server.HTTPServer
handler = http.server.CGIHTTPRequestHandler
handler.cgi_directories = ["/"]
print("Serveur actif sur le port :", PORT)

httpd = server(server_address, handler)
httpd.serve_forever()

index.py : ce script affiche la page html du login pour le chatroom

 
# coding: utf-8

import cgi


form = cgi.FieldStorage()
print("Content-type: text/html; charset=utf-8\n")

print(form.getvalue("name"))

html = """<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
 <head>
 <meta charset="utf-8">
 <!-- importer le fichier de style -->
 <link rel="stylesheet" href="file:///C|/Users\\USER\PycharmProjects\chatroom/style.css" media="screen" type="text/css" />
 
 </head>
  
 <body>
 <center><b><p>Bienvenue dans la Messagerie Instantanée</p></b>
 </center>
 
 <div id="container">
 <!-- zone de connexion -->
 
 <form action="vérification.py" method="POST">

 <h1>Connexion</h1>
 
 <label><b>Nom d'utilisateur</b></label>
 <input type="text" placeholder="Entrer le nom d'utilisateur" name="pseudo" required>

 <label><b>Mot de passe</b></label>
 <input type="password" placeholder="Entrer le mot de passe" name="mot_de_passe" required>

 <input type="submit" id='submit' value='Se Connecter' />
 <h1>inscription</h1>
  <input type="submit" onclick=window.location.href='inscription.html'; value= 'Créer Nouveau Compte' />
 </form>
 </div>
 </body>
</html>
"""

print(html)

5 réponses

mamiemando Messages postés 33367 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 19 novembre 2024 7 801
Modifié le 16 nov. 2022 à 16:12

Bonjour,

Comme je te l'ai expliqué dans ton autre discussion, les classes de bases fournies par python sont assez laborieuses à utiliser (et en plus les tutoriels diffèrent entre python2 et python3 car le paquet http n'est pas organisé pareil). Tu aurais meilleur temps d'utiliser cherrypy.

Mais bref, voici un exemple minimal qui met en évidence un CGI python avec CSS en utilisant le module http en python3. Tous les fichiers qui suivent doivent être positionnés dans le même dossier.

main.py

import time
import http.server
import cgitb; cgitb.enable()  ## This line enables CGI error reporting
from my_handler import MyHandler

server = http.server.HTTPServer
server_address = ("localhost", 8000)
handler = MyHandler
handler.cgi_directories = ["/"]
print(time.asctime(), "Start Server - %s:%s" % server_address)
try:
    httpd = server(server_address, handler)
    httpd.serve_forever()
except KeyboardInterrupt:
    pass
httpd.server_close()
print(time.asctime(), "Stop Server - %s:%s" % server_address)

On prépare le serveur web avec notre propre handler. C'est ce handler qui implémente le comportement du serveur en fonction de l'URI reçue.

main.css

body {
    background-color: #222;
}

h1 {
    color: red;
}

Lorsque le CSS est en action, les titres sont en rouge et le fond est gris foncé.

my_handler.py

import http.server
import traceback

class MyHandler(http.server.CGIHTTPRequestHandler):
    def do_GET(self):
        if self.path.endswith(".py"):
            super().do_GET()
        else:
            try:
                filename = self.path.lstrip("/")
                with open(filename) as f:
                    data = f.read()
                    self.send_response(200)
                    self.end_headers()
                    self.wfile.write(bytes(data, "utf-8"))
            except Exception:
                self.send_error(404, traceback.format_exc())

Ici on rattrape "en CGI" tout appel à une URI qui se finit par ".py" (par exemple "/test_cgi.py"). Sinon on sert le fichier comme un fichier texte (en particulier quand il s'agit d'un fichier css. Cette modification de do_GET nécessaire, sinon la classe Server tente d'exécuter le fichier css comme s'il s'agissait d'un script.

Note qu'on peut améliorer le handler pour rediriger l'URI / vers /index.html, ce qui permettra d'afficher cette page si on va sur http://localhost:8000.

import http.server
import traceback

class MyHandler(http.server.CGIHTTPRequestHandler):
    def do_GET(self):
        if self.path.endswith(".py"):
            super().do_GET()
        else:
            try:
                filename = self.path.lstrip("/")
                if not filename:
                    filename = "index.html"
                with open(filename) as f:
                    data = f.read()
                    self.send_response(200)
                    self.end_headers()
                    self.wfile.write(bytes(data, "utf-8"))
            except Exception:
                self.send_error(404, traceback.format_exc())

index.html

Ce fichier n'est pas nécessaire dans l'absolu mais permet d'avoir quelque chose à afficher quand on va sur http://localhost:8000

<!DOCTYPE html>
<html> 
    <head>
        <meta charset="utf-8" />
        <link rel="stylesheet" href="/main.css">
    </head>
    <body>  
        <h1>Page par défaut index.html</h1>
    </body> 
</html>

test_cgi.py

#!/usr/bin/env python3
from datetime import date


# https://docs.python.org/3/library/cgi.html
print("Content-type: text/html")
print("")

# Now let's play
TEMPLATE_HTML = """<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <link rel="stylesheet" href="/main.css">
    </head>
    <body>
        %s
    </body>
</html>"""
today = date.today()
print(TEMPLATE_HTML % f"""
<h1>Date du jour<h1>
{today}
""")

Trois points pour que ça marche :

1) Le CGI doit avoir des droits en exécution. Sous Linux on lancerait donc :

chmod a+x test_cgi.py

2) Le CGI doit être dans l'un des dossiers référencés par handler.cgi_directories.  Ici, notre CGI est dans le même dossier que le script python qui lance le serveur, ce qui correspond dossier / et est donc conforme à handler.cgi_directories.

3) Le shebang du CGI doit permettre au système d'exploitation de trouver l'interpréteur (ici l'interpréteur python) à utiliser pour exécuter le script. Dans l'absolu, le serveur web pourrait servir à la fois des fichiers écrits python et pourquoi pas des fichiers écrits en perl ou en php. La décision est prise en fonction de cette liste.

Sous Linux, la manière propre de récupérer le chemin de l'interpréteur python est :

#!/usr/bin/env python3

Je laisse le soin aux personnes sous Windows de préciser comment on fait dans ce cas, personnellement, je ne sais pas.

Tests

On lance le serveur :

python3 main.py

Puis on peut tenter dans le navigateur d'accéder à :

Bonne chance

1
rose2022 Messages postés 20 Date d'inscription vendredi 21 octobre 2022 Statut Membre Dernière intervention 22 novembre 2022 1
21 nov. 2022 à 23:58

bonsoir 

merci beaucoup pour votre réponse 

voila dans mon dossier chatroom j'ai le script index.py et mon fichier css 

ce que je fait :

href="chatroom/style.css" écrit dans index.py

mais pourquoi ca ne fonctionne pas je tourne en rond depuis des jours .

salutations

1
Grandasse_ Messages postés 924 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 27 avril 2023 594
15 nov. 2022 à 23:57

Bonjour,

Tu devrais essayer avec le lien relatif vers ton CSS, il ne faut pas chercher "file:///" car le serveur ne connait pas ça


0
rose2022 Messages postés 20 Date d'inscription vendredi 21 octobre 2022 Statut Membre Dernière intervention 22 novembre 2022 1
16 nov. 2022 à 00:20

salut

oui j'ai essayé avec le lien relatif :

href= "C:\\Users\\USER\PycharmProjects\chatroom\style.css"

ca ne fonctionne pas !

merci bien

0
Grandasse_ Messages postés 924 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 27 avril 2023 594
16 nov. 2022 à 19:30

Oui pardon, je me suis mal exprimé. C'est normal que ça ne fonctionne pas.

Il faudrait quelque chose comme :

href="chatroom/style.css"
// ou bien
href="style.css"

ça dépend où se trouve la page qui appelle ce code.

C'est ce qu'on appelle un lien relatif, il part de la page qui l'appelle contrairement à un chemin absolu où on vient indiquer le chemin entier depuis le disque.

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
rose2022 Messages postés 20 Date d'inscription vendredi 21 octobre 2022 Statut Membre Dernière intervention 22 novembre 2022 1
22 nov. 2022 à 01:10

slt

j'ai corrigé ca fonctionne merci faut créer un sous dossier .

0