IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Rust Discussion :

[Rust 1.72][Linux] Web serveur Rust -- css background pas affiché


Sujet :

Rust

  1. #1
    Membre averti

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 313
    Points : 354
    Points
    354
    Par défaut [Rust 1.72][Linux] Web serveur Rust -- css background pas affiché
    Greetings !!

    Je suis en train d'essayer de mettre en place un serveur Web Rust.
    Je suis content ça à l'air de fonctionner en local, cependant, du fait que je ne connaisse pas le moyen de composer une UI style java swing comme à l'époque où on pouvait encore faire des applets, je suis "obligé" de me coltiner css et html.

    Or, autant la page html s'affiche autant le css... il n'y a jamais rien qui s'affiche. J'ai un 'not found' concernant l'image de fond choisie.
    J'ai du mal à trouver dans la doc comment cela fonctionne au niveau du "root directory du serveur" pour Rust, j'ai beau taper l'image à la racine du projet, dans target, au même niveau que le css -- en changeant le path évidemment --, peu importe où je la met, elle n'est pas trouvée.

    Du coup, je me demande si, par hasard il n'y aurait pas quelque chose à côté de laquelle je serais passé...

    La "structure" est la suivante, je fais comme cela quand je "m'amuse" avec Apache:

    /www (root directory du serveur apache)

    ...ici j'ai fais un raccourcis mais normalement je mets ces dossiers dans un dossier qui est nommé selon le nom de domaine

    /www/css <- où je range les "scripts" .css
    /www/png <- où je range mes images
    /www/html <- où je range mes fichiers .html
    etc...

    Dans mon code:

    Rust
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    pub fn get_index () -> HttpResponse
    {
    	let mut htmldata = feedme("./www/html/index.html");
    	let cssdata = feedme ("./www/css/index.css");
     
    	htmldata = htmldata.replace("{{BASE_CSS}}",&cssdata);
     
    	HttpResponse::Ok().content_type("text/html").body(htmldata)
    }
    pub fn feedme(file_path: &str) -> String
    {
    	let datas = fs::read_to_string(file_path);
    	if datas.is_err()
    	{
    		error!("{}",datas.as_ref().unwrap_err());
    		String::from(datas.unwrap_err().to_string())
    	}
    	else
    	{
    		datas.unwrap()
    	}
    }
    Tout à l'air de fonctionner sauf que le css n'est pas pris en compte et j'ai un 404 concernant l'image.

    css
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    body
    {
    	background-image: url("../png/mtga000.png");
    	background-attachment: fixed;
    	background-repeat: no-repeat;
    	background-position: center;
    }
    Alors je sais pas j'ai essayé en chemin absolu, je pense avoir fait toutes les combinaisons en incluant le déplacement du répertoire png à plusieurs endroits (y compris le répertoire target/debug de Rust) mais rien n'y fait.

    Serveur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    let serveur = HttpServer::new
          (
            ||
              {
                  App::new().route("/",web::get().to(get_index)).route("/post",web::post().to(actions))
              }
          );
        println!("Serving on http://192.168.0.4:4040...");
        info!("Server is on !!");
    J'ai même remplacé le '/' par '/www' sans aucune conviction (en changeant les chemins dans get_index()), et de nouveau rien...
    Le replace() fonctionne, vu que j'ai le 404 concernant l'image non trouvée...

    Je serais amateur de pistes pour comprendre ce qui ne fonctionne pas dans cette approche.
    Je déteste le Web, donc, je suis pas très motivé mais ici, faute de solutions je n'ai pas le choix, je dois me taper cette merde de html et css à défaut de quelque chose d'équivalent aux Applets de java où via Swing je pouvais composer mon UI et via Java gérer les interactions avec les contrôles. C'est ce que je cherche à faire ici: me détacher de html/javascript et autres merdes mais malgré tout utiliser un navigateur Web pour interagir avec mon application. Depuis 2017 et la décision de ne plus permettre aux Applets de fonctionner j'ai perdu mon confort.

    Donc si vous aviez des pistes pour faire du Rust/GTK (via Glade) avec un truc qui ressemble à des Applets en Rust je suis preneur ^^

  2. #2
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2016
    Messages
    1 471
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 471
    Points : 6 110
    Points
    6 110
    Par défaut
    Bonjour,

    Citation Envoyé par hurukan Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    pub fn get_index () -> HttpResponse
    {
    	let mut htmldata = feedme("./www/html/index.html");
    	let cssdata = feedme ("./www/css/index.css");
     
    	htmldata = htmldata.replace("{{BASE_CSS}}",&cssdata);
     
    	HttpResponse::Ok().content_type("text/html").body(htmldata)
    }
    pub fn feedme(file_path: &str) -> String
    {
    	let datas = fs::read_to_string(file_path);
    	if datas.is_err()
    	{
    		error!("{}",datas.as_ref().unwrap_err());
    		String::from(datas.unwrap_err().to_string())
    	}
    	else
    	{
    		datas.unwrap()
    	}
    }
    Telle que la fonction get_index a été codée, elle renvoie systématiquement une réponse HTTP "OK" (donc un code 200), indépendamment de si les fichiers "./www/html/index.html" et "./www/css/index.css" ont été trouvés. Il y aura juste le texte qui change dans le body. Donc, si la réponse HTTP a un code 404, cela vient d'ailleurs. Dans ce genre de cas, il faut se pencher sur le routing :

    Citation Envoyé par hurukan Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    let serveur = HttpServer::new
          (
            ||
              {
                  App::new().route("/",web::get().to(get_index)).route("/post",web::post().to(actions))
              }
          );
        println!("Serving on http://192.168.0.4:4040...");
        info!("Server is on !!");
    Cela ne ressemble pas à du axum, ni à du Actix Web, ni à du warp, ni à du poem… Je ne sais pas quel crate est utilisé, donc je ne peux pas aider plus pour le moment. Es-tu sûr que le serveur est lié à la socket avec l'adresse IP "192.168.0.4" et le port 4040 ?

  3. #3
    Membre averti

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 313
    Points : 354
    Points
    354
    Par défaut
    Oui le serveur est connecté et renvoie bien ce que j'ai dans le fichier HTML.
    Un "netstat --anp --tcp" indique qu'il y a bien un serveur qui écoute sur le port 4040.

    sirius:/2023/Programmation/Rust # netstat -anp --tcp
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
    tcp 0 0 192.168.0.4:4040 0.0.0.0:* LISTEN 7314/./uepMagicStat
    Le soucis c'est que je ne sais pas comment faire pour afficher cette image.
    J'ignore comment le serveur détermine son "DocumentRoot". (https://paste.opensuse.org/pastes/71e87d26ac4a)

    Quand j'intègre exactement la même structure des fichiers dans Apache, j'ai bien tout.
    J'ai mis à jour actix-web et du coup maintenant mon code ne compile plus.

  4. #4
    Membre averti

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 313
    Points : 354
    Points
    354
    Par défaut
    Oui. J'ai dû modifier quelque peu le code source.
    Dans un premier temps je cherche juste à m'assurer que le serveur affiche une page Web avec du CSS dedans.

    Je me base sur le livre "Rust Web Programming 2nd edition" (MAXWELL FLITTON), et aussi quelques exemples trouvés dans les docs Rust.
    Je pense que c'est le mix des deux sources qui m'a conduit à mettre en place le serveur avec actix-bab version 1.0.9 !! Je l'ai mis à jour du coup pour 4.0.1.
    Se faisant, apparemment, la mise en place est drastiquement différente et il a fallu que j'adapte mon code source pour que l'application se compile au minimum.

    -- j'ai jamais réussi à "downgrader" de 4.0.1 à 1.0.9 d'ailleurs --

    Dans mon main() j'ai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    let serveur=HttpServer::new
          (
              ||
                App::new().service(get_index)
          );
    ...et évidemment un peu plus loin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    serveur.bind("192.168.0.4:4040").expect("error binding server to address").run().await;
    J'ai réussi à compiler mon application en faisant aussi des changements dans le "module" où se trouvent les fonctions qui sont censées devenir des "services"

    functions_web_related
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #[get("/")]
    async fn get_index() -> HttpResponse
    {
    	let mut htmldata = feedme("./www/html/index.html");
    	let cssdata = feedme ("./www/css/index.css");
     
    	htmldata = htmldata.replace("{{BASE_CSS}}",&cssdata);
     
    	HttpResponse::Ok().content_type("text/html").body(htmldata)
    }
     
    pub fn feedme(file_path: &str) -> String
    {
    	let datas = fs::read_to_string(file_path);
    	if datas.is_err()
    	{
    		error!("{}",datas.as_ref().unwrap_err());
    		String::from(datas.unwrap_err().to_string())
    	}
    	else
    	{
    		datas.unwrap()
    	}
    }
    De ce que je comprends, j'ai pas encore été loin: les deux fichiers index.html et index.css sont bien injectés et affichés dans le navigateur.
    Là où je coince c'est que l'image n'est pas affichée (avec un 404).

    J'ai mis cette image (en modifiant le chemin dans le .css) à la racine du projet, dans tous les répertoires possibles et imaginables, rien n'y fait.

  5. #5
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2016
    Messages
    1 471
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 471
    Points : 6 110
    Points
    6 110
    Par défaut
    Citation Envoyé par hurukan Voir le message
    Je me base sur le livre "Rust Web Programming 2nd edition" (MAXWELL FLITTON), et aussi quelques exemples trouvés dans les docs Rust.
    Je pense que c'est le mix des deux sources qui m'a conduit à mettre en place le serveur avec actix-bab version 1.0.9 !! Je l'ai mis à jour du coup pour 4.0.1.
    Se faisant, apparemment, la mise en place est drastiquement différente et il a fallu que j'adapte mon code source pour que l'application se compile au minimum.

    -- j'ai jamais réussi à "downgrader" de 4.0.1 à 1.0.9 d'ailleurs --
    Je n'ai pas lu ce livre, mais je vois que le code source associé se trouve ici : https://github.com/PacktPublishing/R...ng-2nd-Edition

    Pour le code associé au chapitre 4, je vois que c'est actix-web version 4 qui est utilisé.

    Les versions vraiment utilisées des crates se trouvent dans le fichier Cargo.lock, ce dernier étant généré à partir du fichier Cargo.toml. Pour plus de détails sur comment spécifier les versions des crates, je renvoie au Cargo Book : https://doc.rust-lang.org/cargo/refe...endencies.html

Discussions similaires

  1. Réponses: 78
    Dernier message: 05/02/2024, 17h28
  2. Réponses: 1
    Dernier message: 25/07/2014, 10h07
  3. Réponses: 4
    Dernier message: 16/04/2013, 17h13
  4. Solution Serveur Linux + Web App + ERP
    Par FleXe on dans le forum Développement
    Réponses: 1
    Dernier message: 02/05/2012, 11h52
  5. Lenteur chargement pages web : serveur linux local
    Par ashker dans le forum Apache
    Réponses: 10
    Dernier message: 13/09/2011, 16h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo