Site web de Duniter : erreurs lors de l'installation / Pelican / Python

Salut,

Ça y est, je me décide à apprendre à utiliser les Static Site Generators, suite à quelques discussions avec @Moul sur l’usage déjà en cours de GitLab Pages, et parce qu’un peu de lecture m’a convaincu qu’apprendre à utiliser de tels trucs sera un bon investissement de mon temps.

Mon intention est de traduire mes scripts PHP dans un SSG, de sorte de pouvoir profiter des avantages du full statique, mais quel SSG choisir ?

Moul m’a indiqué que le site de Duniter utilisait Pelican et, même si je ne suis pas hyper hyper familier de Python, je me dis que c’est pas con d’apprendre celui-là, vu que ça peut me permettre de contribuer au site duniter.org à l’occaz.

Seulement voilà, je ne passe pas l’étape d’installation :sob:

J’ai d’abord une première erreur lorsque je lance $ ./develop_server.sh start 8556

WARNING: JINJA_EXTENSIONS setting has been deprecated, moving it to JINJA_ENVIRONMENT setting.
CRITICAL: KeyError: u'JINJA_ENVIRONMENT'
Traceback (most recent call last):
  File "/home/boris/www/duniter_website_fr/bin/pelican", line 8, in <module>
    sys.exit(main())
  File "/home/boris/www/duniter_website_fr/local/lib/python2.7/site-packages/pelican/__init__.py", line 512, in main
    pelican, settings = get_instance(args)
  File "/home/boris/www/duniter_website_fr/local/lib/python2.7/site-packages/pelican/__init__.py", line 397, in get_instance
    settings = read_settings(config_file, override=get_config(args))
  File "/home/boris/www/duniter_website_fr/local/lib/python2.7/site-packages/pelican/settings.py", line 186, in read_settings
    settings = handle_deprecated_settings(settings)
  File "/home/boris/www/duniter_website_fr/local/lib/python2.7/site-packages/pelican/settings.py", line 291, in handle_deprecated_settings
    settings['JINJA_EXTENSIONS']
KeyError: u'JINJA_ENVIRONMENT'

Ce problème est dû à la MàJ de Pelican vers la v3.7 apparemment d’après ce qu’ils disent dans leur journal de bord.

Bon, du coup j’ai bidouillé le fichier local/pelicanconf.py de la façon suivante :

JINJA_EXTENSIONS = ['jinja2.ext.i18n']

remplacé par :

JINJA_ENVIRONMENT = {
    'extensions': ['jinja2.ext.i18n']
}

et ça semble fonctionner.

Ensuite j’ai une autre erreur :

CRITICAL: TypeError: not all arguments converted during string formatting
Traceback (most recent call last):
  File "/home/boris/www/duniter_website_fr/bin/pelican", line 8, in <module>
    sys.exit(main())
  File "/home/boris/www/duniter_website_fr/local/lib/python2.7/site-packages/pelican/__init__.py", line 556, in main
    autoreload(watchers, args, old_static, reader_descs)
  File "/home/boris/www/duniter_website_fr/local/lib/python2.7/site-packages/pelican/__init__.py", line 460, in autoreload
    pelican.run()
  File "/home/boris/www/duniter_website_fr/local/lib/python2.7/site-packages/pelican/__init__.py", line 137, in run
    p.generate_output(writer)
  File "/home/boris/www/duniter_website_fr/local/lib/python2.7/site-packages/pelican/generators.py", line 688, in generate_output
    self.generate_pages(writer)
  File "/home/boris/www/duniter_website_fr/local/lib/python2.7/site-packages/pelican/generators.py", line 597, in generate_pages
    self.generate_articles(write)
  File "/home/boris/www/duniter_website_fr/local/lib/python2.7/site-packages/pelican/generators.py", line 469, in generate_articles
    url=article.url, blog=True)
  File "/home/boris/www/duniter_website_fr/local/lib/python2.7/site-packages/pelican/writers.py", line 278, in write_file
    override_output)
  File "/home/boris/www/duniter_website_fr/local/lib/python2.7/site-packages/pelican/writers.py", line 210, in _write_file
    output = template.render(localcontext)
  File "/home/boris/www/duniter_website_fr/local/lib/python2.7/site-packages/jinja2/environment.py", line 1008, in render
    return self.environment.handle_exception(exc_info, True)
  File "/home/boris/www/duniter_website_fr/local/lib/python2.7/site-packages/jinja2/environment.py", line 780, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/boris/www/duniter_website_fr/pelican-themes/pelican-bootstrap3/templates/article.html", line 1, in top-level template code
    {% extends "base.html" %}
  File "/home/boris/www/duniter_website_fr/pelican-themes/pelican-bootstrap3/templates/base.html", line 95, in top-level template code
    <link href="{{ SITEURL }}/{{ CATEGORY_FEED_ATOM|format(category.slug) }}" type="application/atom+xml" rel="alternate"
  File "/home/boris/www/duniter_website_fr/local/lib/python2.7/site-packages/jinja2/filters.py", line 685, in do_format
    return soft_unicode(value) % (kwargs or args)
TypeError: not all arguments converted during string formatting
127.0.0.1 - - [10/Nov/2019 12:01:09] "GET / HTTP/1.1" 200 -

Là, et j’aurais pas dû, je suis les conseils de @vit et je supprime python-2.7 (attention : il ne faut jamais désinstaller Python sous Linux. L’erreur semble disparaître.

[EDIT]Quoique… en fait je l’ai eu de nouveau.

Un utilisateur de Pelican explique qu’il faudrait éditer le fichier base.html du template (donc pelican-themes/pelican-bootstrap3/templates/base.html dans notre cas) de la façon suivante :
Remplacer

CATEGORY_FEED_ATOM|format(category.slug)

par

CATEGORY_FEED_ATOM|format(slug=category.slug)

et

TAG_FEED_ATOM|format(tag.slug)

par

TAG_FEED_ATOM|format(slug=tag.slug)

Ok, je fais ça.

Mais il explique aussi qu’il faut modifier le fichier pelicanconf.py pour remplacer %s.atom.xml par {slug}.atom.xml, et là je ne vois pas où c’est.
[/EDIT]

Mais ensuite lorsque je relance $ ./develop_server.sh start 8556 c’est bizarre parce que quand je me rends sur http://localhost:8556/ j’ai ça :

tandis que dans certains répertoire, comme content/ par exemple j’ai une erreur :

Et dans le terminal j’ai l’erreur suivante :

ERROR: Cannot load plugin `i18n_subsites`
  | ImportError: cannot import name Draft

et aussi :

CRITICAL: UndefinedError: 'gettext' is undefined
Traceback (most recent call last):
  File "/home/boris/www/duniter_website_fr/bin/pelican", line 8, in <module>
    sys.exit(main())
  File "/home/boris/www/duniter_website_fr/local/lib/python2.7/site-packages/pelican/__init__.py", line 556, in main
    autoreload(watchers, args, old_static, reader_descs)
  File "/home/boris/www/duniter_website_fr/local/lib/python2.7/site-packages/pelican/__init__.py", line 460, in autoreload
    pelican.run()
  File "/home/boris/www/duniter_website_fr/local/lib/python2.7/site-packages/pelican/__init__.py", line 137, in run
    p.generate_output(writer)
  File "/home/boris/www/duniter_website_fr/local/lib/python2.7/site-packages/pelican/generators.py", line 688, in generate_output
    self.generate_pages(writer)
  File "/home/boris/www/duniter_website_fr/local/lib/python2.7/site-packages/pelican/generators.py", line 597, in generate_pages
    self.generate_articles(write)
  File "/home/boris/www/duniter_website_fr/local/lib/python2.7/site-packages/pelican/generators.py", line 469, in generate_articles
    url=article.url, blog=True)
  File "/home/boris/www/duniter_website_fr/local/lib/python2.7/site-packages/pelican/writers.py", line 278, in write_file
    override_output)
  File "/home/boris/www/duniter_website_fr/local/lib/python2.7/site-packages/pelican/writers.py", line 210, in _write_file
    output = template.render(localcontext)
  File "/home/boris/www/duniter_website_fr/local/lib/python2.7/site-packages/jinja2/environment.py", line 1008, in render
    return self.environment.handle_exception(exc_info, True)
  File "/home/boris/www/duniter_website_fr/local/lib/python2.7/site-packages/jinja2/environment.py", line 780, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/boris/www/duniter_website_fr/pelican-themes/pelican-bootstrap3/templates/article.html", line 1, in top-level template code
    {% extends "base.html" %}
  File "/home/boris/www/duniter_website_fr/pelican-themes/pelican-bootstrap3/templates/base.html", line 169, in top-level template code
    {% block content %}
  File "/home/boris/www/duniter_website_fr/pelican-themes/pelican-bootstrap3/templates/article.html", line 82, in block "content"
    title="{{ _('Permalink to') }} {{ article.title|striptags }}">
  File "/home/boris/www/duniter_website_fr/local/lib/python2.7/site-packages/jinja2/ext.py", line 134, in _gettext_alias
    return __context.call(__context.resolve('gettext'), *args, **kwargs)
jinja2.exceptions.UndefinedError: 'gettext' is undefined

Et là du coup j’ai l’impression que ça vient du fait que j’ai désinstallé python2.7 :confused:

[EDIT]
Bon, pour ça, apparemment un coup de

pip install python-gettext

fait le taf.

RE-EDIT: ah non :frowning:
[/EDIT]

Et d’ailleurs maintenant quand j’accède à localhost:8556 j’ai plus que ça :


Quelqu’un saurait-il résoudre ?

Merci :slight_smile:

3 J'aimes

Perso je préconise plutôt le générateur de sites statiques zola : https://github.com/getzola/zola

Plus simple a installer et a utiliser : https://www.getzola.org/documentation/getting-started/installation/

C’est ce qu’on utilise pour le site web de Dunitrust en cous de construction :slight_smile:

Hello,

je connaîs mal Pelican, mais effectivement, il nécessite de maîtriser son environnement Python et semble, au gré des mises à jour, casser la compatibilité avec les anciennes versions et les plugins.

Bref, je pense que Pelican n’est pas à conseillé pour quelqu’un qui n’a pas déjà un pied dans Python.
Cela va te donner une mauvaise première expérience de Python, et de Pelican (dont je trouve les configs mal fichues car pas claires et en code Python…).

Désinstallation de Python 2.7

Ne jamais faire ça sur un Linux !

Les distributions Linux utilisent le Python installé par défaut, il ne faut donc pas le désinstaller.
Il faut utiliser Pyenv pour installer des versions de Python dans son home et indépendantes du système (comme yarn pour nodejs).

Le conseil est déjà moyen sur un windows, à moins de n’avoir installé une version de Python que pour Pelican…

Mais je vois que ton Python 2.7 semble installé dans le dossier local, ce qui ne semble pas être la version utilisée par le système.

Le conseil d’@elois me semble un bon choix pour concentrer ton énergie sur le site et pas le générateur. Pelican semble être plus une boîte à outil qu’un générateur clef en main.

2 J'aimes

@elois et @vit > Ouais, je vais peut-être préférer Zola à Pelican pour les sites de Cesium et Silkaj. En attendant, ça pourrait être pas mal que des gens comme moi, capables seulement de bidouiller des sites web et pas de la blockchain puissent monter en compétence là-dessus, histoire de vous permettre de vous concentrer sur ce que vous seuls êtes capables de faire.

Du coup je vais quand même continuer à essayer de comprendre comment Pelican fonctionne, et puis si j’arrive j’essayerai de mettre à jour la doc en conséquence.

J’en profite pour vous signaler qu’on a beaucoup de WARNING quand on lance la génération avec pelican, dont un type que je comprends, et qui est dû au fait que vous essayez d’utiliser le même slug (permalien, URI) pour différentes pages. Pelican résoud le problème en générant le permalien à partir du nom du fichier plutôt qu’à partir du slug spécifié en markdown, donc ça marche, mais ça fait quand même un log super long qui m’empêche de bien voir les erreurs.

@vit et @elois :

WARNING: There are 2 items "with slug "commandes"" with lang fr: 
  | /home/boris/www/PelicanTest1/content/pages/wiki/duniter/lancement-au-boot.md
  | /home/boris/www/PelicanTest1/content/pages/wiki/duniter/commandes.md
WARNING: There are 2 original (not translated) items with slug "commandes": 
  | /home/boris/www/PelicanTest1/content/pages/wiki/duniter/lancement-au-boot.md
  | /home/boris/www/PelicanTest1/content/pages/wiki/duniter/commandes.md

@elois :

WARNING: There are 2 items "with slug "configurer"" with lang fr: 
  | /home/boris/www/PelicanTest1/content/pages/wiki/duniter/configurer.md
  | /home/boris/www/PelicanTest1/content/pages/wiki/duniter/git-branches.md
WARNING: There are 2 original (not translated) items with slug "configurer": 
  | /home/boris/www/PelicanTest1/content/pages/wiki/duniter/configurer.md
  | /home/boris/www/PelicanTest1/content/pages/wiki/duniter/git-branches.md

@cgeek et @inso :

WARNING: There are 2 items "with slug "modules"" with lang fr: 
  | /home/boris/www/PelicanTest1/content/pages/wiki/duniter/liste-modules.md
  | /home/boris/www/PelicanTest1/content/pages/wiki/duniter/modules.md
WARNING: There are 2 original (not translated) items with slug "modules": 
  | /home/boris/www/PelicanTest1/content/pages/wiki/duniter/liste-modules.md
  | /home/boris/www/PelicanTest1/content/pages/wiki/duniter/modules.md

EDIT : Bon, en fait je viens de découvrir qu’on peut les faire en ajoutant excluant WARNING par WARNING dans le fichier pelicanconf.py. Du coup j’ai exclu les WARNING qui apparaissaient en ajoutant à la fin de ce fichier les lignes suivantes :

import logging
LOG_FILTER = [
	(logging.WARN, 'Empty alt attribute for image %s in %s'), 
	(logging.WARN, '{filename} used for linking to static content %s in %s. Use {static} instead'),
	(logging.WARN, "Meta tag in file %s does not have a 'name' attribute, skipping. Attributes: %s"), 
	(logging.WARN, "Unable to find '%s', skipping url replacement."), 
]
1 J'aime

Alors, je suis enfin parvenu à l’installer à peu près :

En fait après avoir suivi le guide de démarrage rapide et bidouillé un peu Pelican sur un projet vierge, j’ai commencé à comprendre à peu près comment ça marchait.

Finalement l’essentiel des problèmes avec le site Duniter vient du fait que le tutoriel nous fait télécharger une version récente de Pelican, mais des fichiers (themes, plugins et fichiers de configuration) compatibles avec les anciennes versions de Pelican, mais pas les nouvelles.

Pour résoudre les erreurs de compilations et la frustration que ça génère chez le contributeur, on pourrait :

  • soit faire installer au contributeur une version particulière de Pelican, de la même façon que dans le tutoriel de développement Cesium Benoît nous fait utiliser des versions particulières de NVM et Ionic (mais est-ce possible avec pip et Pelican ? pas sûr…)
  • soit ne pas livrer les thèmes et les plugins
  • soit avertir l’utilisateur que Pelican ne fait pas trop dans la compatibilité ascendante et que les problèmes peuvent venir de là, auquel cas il peut essayer d’en résoudre une partie en mettant à jour complètement les extensions et thèmes (plutôt que de chercher des réponses dans un moteur de recherche, réponses qui nous amènent bidouiller ligne par ligne le code d’un plugin, ce qui n’a pas trop de sens quand on pourrait le mettre à jour complètement)
  • soit suivre lire les changelog de Pelican et faire les mises à jour en peu de temps après leur sortie (mais j’ai aucune envie de faire ça, perso)

Ressources utiles

(qu’on pourrait ajouter en haut du README)

Comment régler les soucis de compilation

Mettre à jour pelican-plugins/i18n_subsites

Mettre à jour pelican-themes/pelican-bootstrap3 : par contre ça va casser des choses (par exemple, sur l’accueil, on n’aura plus d’image à côté de chaque article) puisque le thème a été personnalisé sans utiliser de thème enfant.

Dans pelicanconf.py, changer :

# Social widget
ACCEPTED_MENUS = ['comprendre',
         'obtenir-des-g1',
         'contribuer',
         'contact',
         'wiki','faq',
         'a-propos']

pour


MENUITEMS = [
               ['Comprendre', '/comprendre'], 
               ['Obtenir des Ğ1', '/obtenir-des-g1'],
               ['Contribuer', '/contribuer'], 
               ['Contact', '/contact'], 
               ['Wiki', '/wiki'],
               ['FAQ','/faq'], 
               ['À propos', '/a-propos']
            ]
# Social widget

Comment virer les pages en trop dans la barre de navigation

Changer

DISPLAY_PAGES_ON_MENU = True

pour

DISPLAY_PAGES_ON_MENU = False

Comment cacher les WARNING qui apparaissent à la compilation

Dans pelicanconf.py, ajouter :

import logging
LOG_FILTER = [
	(logging.WARN, 'Empty alt attribute for image %s in %s'), 
	(logging.WARN, '{filename} used for linking to static content %s in %s. Use {static} instead'),
	(logging.WARN, "Meta tag in file %s does not have a 'name' attribute, skipping. Attributes: %s"), 
	(logging.WARN, "Unable to find '%s', skipping url replacement."), 
]

Comment résoudre les problèmes de slug du wiki

Attention : lorsqu’on met à jour pelican-plugins/pelican-page-hierarchy, la nouvelle version passe en mode tolérance zéro avec nos doublons.

Du coup on va se taper beaucoup de WARNING pour les slugs identiques, du style :

WARNING: There are 2 original (not translated) items with slug "wiki": 
  | /home/boris/www/website_fr/content/pages/wiki/preconisations-client-duniter.md
  | /home/boris/www/website_fr/content/pages/wiki.md

mais aussi des erreurs critiques :

CRITICAL: RuntimeError: File /home/boris/www/website_fr/output/pages/wiki/duniter/configurer.html is set to be overridden twice

ici parce que la page /pages/contribuer.md contient :

Slug: contribute

et que la page /pages/contribute.html veut elle aussi être compilée en /output/contribute

On pourrait penser que bidouiller le fichier pelicanconf.py améliorerait les choses, par exemple en ajoutant :

SLUGIFY_SOURCE = 'basename'

et espérer que le système ignore nos slugs en doublon pour s’appuyer plutôt sur les noms de fichier, mais en réalité ça ne résout rien, puisque cette variable sert à définir comment sont générés les slugs quand ils ne sont pas spécifiés explicitement par l’utilisateur. Ca peut être :

  • à partir du titre (réglage par défaut : ‹ title ›)
  • à partir du nom de fichier (‹ basename ›)

(voir la doc)

Du coup il nous sort :

CRITICAL: RuntimeError: File /home/boris/www/website_fr/output/pages/wiki/duniter/configurer.html is set to be overridden twice

Parce que /pages/wiki/duniter/configurer.md et /pages/wiki/duniter/git-branches.md contiennent tous deux :

Slug: configurer

Au final, virer complètement la ligne Slug de cette douzaine de fichiers qui génèrent des doublons est la solution la plus simple.

Comment faire un thème enfant ?

Solution trouvée dans la documentation

themes_path = "themes/"
THEME = themes_path + "pelican-bootstrap3/"
THEME_TEMPLATES_OVERRIDES = [
                             themes_path + "pelican-bootstrap3-duniter/templates"
                            ]

Pourquoi est-ce qu’on accède via le port 8556 au lieu de 8000 ?

Est-ce que quelqu’un pourrait m’expliquer à quoi sert le script develop_server.sh et pourquoi on accède via le port 8556 au lieu de 8000 ?

Car la commande

pelican -l

(que je trouve plus pratique) rend le serveur accessible à http://localhost:8000 :thinking:

2 J'aimes

Hum, il m’est arrivé des trucs bizarres là… et je viens de comprendre à peu près pourquoi.

Le README de website_fr nous propose de taper :

git clone https://github.com/duniter/website_fr.git

(jusque là pas de problème)

En revanche, le README de website_en lui nous propose de taper :

git clone https://github.com/duniter/website.git

qui est aussi le site français :face_with_raised_eyebrow:

Sauf que c’est une vielle version (la licence est en v0.2.3 alors qu’elle est en v.0.2.8 sur la version correcte de website_fr).

La commande correcte pour le site anglais doit être :

git clone https://github.com/duniter/website_en.git
1 J'aime

oui tout a fait la doc du site anglais n’est pas a jours, une MR est bienvenue :slight_smile:

J’essaye de m’y coller mais j’ai saoulé le GitLab là je crois ; il rechigne à me charger ses pages rapidement.

Lol non c’est pas toi, il est souvent dans les choux on prévois de le migrer

Ah.

Je suis déçu.

EDIT : bon, j’ai l’impression d’avoir réussi à solutionner le gros des problèmes :

En tous cas maintenant ça marche chez moi.

(et j’ai fait quelques petites améliorations comme utiliser un thème enfant plutôt que modifier les originaux en dur)

1 J'aime

Tu peux : pip install joliciel==1.2.0

Une fois que tu es satisfait des versions installées, tu les sauvegardes dans un fichier avec freeze :

http://sametmax.com/votre-python-aime-les-pip/

Bravo pour ton opiniâtreté ! :wink:

PS: sur le site sametmax tu trouveras des articles sur l’indispensable pyenv, pour choisir ta version de python, puis des environnements virtuels avec venv pour ne pas pourrir ton système…

1 J'aime

Merci :slight_smile:

Tu avais raison : j’ai effectivement pourri mon Linux avec cette désinstallation de python-2.7 et la soixantaine de paquets qui en dépendaient. Après redémarrage, j’ai 2-3 bugs un peu chiants au niveau de l’interface graphique. Bon, c’est pas la mort, mais c’est pas pratique.

Tu dois pouvoir rattraper le coup avec une réinstallation depuis synaptic ou yum ou apt-get, non ?

Edit : J’ai mis un avertissement sur mon conseil moisi… Désolé que cela ait pourri ton système… :flushed:

1 J'aime

Bah, t’inquiète, ça arrive, et puis ton conseil était valable pour Windows. J’aurais pas du sortir du champ de validité haha ^^

1 J'aime