Nel mondo Python, molti sviluppatori amano il database NoSQL Redis per la sua velocità e la disponibilità di un solido assortimento di librerie client. Nel mondo di WordPress, Redis è spesso la tecnologia da utilizzare quando è necessaria una cache persistente di oggetti per velocizzare l’accesso ai dati del backend.

E questi due mondi si possono unire manipolando i contenuti di WordPress con un’applicazione Python.

In questo tutorial vedremo come postare i contenuti direttamente su Redis costruendo un’applicazione Python che utilizza la famosa libreria redis-py e come postare attraverso l’API REST di WordPress.

Che cos’è Redis?

Redis, o Remote Dictionary Server, è un database NoSQL veloce e una cache in-memory sviluppata da Salvatore Sanfilippo e mantenuta da Redis Ltd. (ex Redi Labs). Le versioni open-source di Redis sono disponibili con licenza Berkeley Source Distribution (BSD), mentre Redis Ltd. offre anche incarnazioni commerciali del server in ambito enterprise e cloud.

Redis si distingue dagli altri database NoSQL per il suo meccanismo di archiviazione dei dati. Di solito viene chiamato “data structure store” perché memorizza i dati con gli stessi tipi di dati che si trovano in molti linguaggi di programmazione, tra cui stringhe, set, liste e dizionari (o hash). Oltre a supportare strutture semplici, Redis supporta strutture di dati avanzate per attività come la geolocalizzazione e l’elaborazione di flussi.

Prerequisiti dell’applicazione Python

Prima di iniziare a creare l’applicazione, sarà necessario installare in locale i seguenti tre elementi:

Suggerimento: potete creare facilmente questo ambiente di sviluppo all’interno di Docker installando il pacchetto DevKinsta di Kinsta pronto per WordPress.

Una volta installati i prerequisiti, è il momento di collegare il tutto. Più precisamente, andremo a creare un’applicazione Python che prende i post di WordPress di un utente in formato dizionario e li salva in una cache Redis.

Creare un’applicazione Python per salvare un post nella cache Redis

La cache Redis è un efficiente meccanismo di caching per i siti web. Memorizza le informazioni richieste di frequente per un accesso più rapido e comodo. La cache memorizza le informazioni in una struttura di dati chiave-valore.

Iniziamo creando una nuova cartella per il progetto chiamata python-redis. Dopodiché, avviamo il terminale di comando, cd in python-redis e installiamo redis-py eseguendo il seguente comando:

pip install redis

Al termine dell’installazione, creiamo un nuovo file chiamato main.py nella cartella python-redis. Apriamo il file nel nostro editor di testo preferito e inseriamo i blocchi di codice qui sotto.

Iniziamo importando la libreria redis-py appena installata e impostiamo l’host e la porta di Redis:

import redis
redis_host = 'localhost'
redis_port = 6379

Ora, definiamo i valori del post di WordPress come coppie chiave/valore in un dizionario. Ecco un esempio:

post = {
    'ID': 1,
    'post_author': 1,
    'post_date': '2024-02-05 00:00:00',
    'post_date_gmt': '2024-02-05 00:00:00',
    'post_content': 'Test Post <br/><a href="http://www.my-site.com/">related blog post</a>',
    'post_title': 'My first post',
    'post_excerpt': 'In this post, I will...',
    'post_status': 'publish',
    'comment_status': 'open',
    'ping_status': 'open',
    'post_password': 'my-post-pwd',
    'post_name': 'my-first-post',    
}

Nota: in un’applicazione reale, il contenuto del post potrebbe provenire da un modulo di input HTML.

Aggiungiamo al codice una funzione redis_dict() che si connetterà al server Redis locale, memorizzerà il post di cui sopra nella cache di Redis e stamperà i valori creati con successo nella console:

def redis_dict():
    try:
        r = redis.StrictRedis(host = redis_host, port = redis_port, decode_responses=True)
        r.hset("newPostOne", mapping=post)
        msg = r.hgetall("newPostOne")
        print(msg)
    except Exception as e:
        print(f"Something went wrong {e}")

# Runs the function:
if __name__ == "__main__":
    redis_dict()

A meno che abbiamo lanciato Redis all’interno di Docker, richiamiamo l’interfaccia a riga di comando di Redis con il seguente comando:

redis-cli

Ora eseguiamo lo script Python:

python main.py

L’esecuzione dello script aggiunge il post all’archivio di valori chiave di Redis. Dovremmo vedere la seguente risposta nella console del terminale:

Schermata del terminale che mostra i dati inviati via Python a un database Redis.
L’output della console mostra il post dell’applicazione Python aggiunto all’archivio Redis.

Abbiamo salvato un post nel nostro database Redis locale.

Ora carichiamo questo post sul sito WordPress utilizzando l’API REST di WordPress, memorizzandolo nel database predefinito MariaDB o MySQL invece che in Redis.

Caricare un post su WordPress utilizzando l’API REST

L’API REST di WordPress fornisce una serie di endpoint che possiamo chiamare dall’applicazione per interagire con WordPress. Utilizziamo l’endpoint post per creare un post in WordPress.

Fase 1: Impostare la password dell’applicazione in WordPress

L’API di WordPress richiede una password di applicazione per consentire all’app di accedere ai dati del sito WordPress. La password è una chiave segreta di 24 caratteri che dovremo includere in ogni richiesta all’API REST.

Generiamo una password di applicazione nella pagina Profilo utente della bacheca di WordPress. Possiamo assegnare un nome facile da usare a ogni password dell’applicazione, ma non potremo visualizzare la password stessa dopo averla generata (quindi facciamone subito una copia):

Schermata che mostra l'interfaccia per la generazione di una password API in WordPress.
Generazione della password di un’applicazione nella bacheca di WordPress.

Fase 2: Pubblicare su WordPress con l’applicazione Python

Per prima cosa, installiamo la libreria di richieste Python per effettuare la richiesta HTTP all’API di WordPress. Per farlo, eseguiamo il seguente comando nel terminale:

pip install requests

Quindi, all’interno della cartella python-redis, creiamo un nuovo file chiamato app.py e apriamo il file con il nostro editor di testo.

Iniziamo importando i moduli requests, json e base64:

import requests
import json
import base64

Definiamo l’URL di base dell’API, il nome utente e la password di WordPress. Per la variabile password, utilizziamo la password dell’applicazione che abbiamo generato in WordPress:

url = 'http://localhost/wp-json/wp/v2'
user = '<Your username here>'
password = '<Your application password here>'

Ora, uniamo user e password, codifichiamo il risultato e passiamolo alle intestazioni della richiesta:

creds = user + ":" + password
token = base64.b64encode(creds.encode())
header = {'Authorization': 'Basic ' + token.decode('utf-8')}

Ed ecco il corpo del post:

post = {    
    'author': 1,
    'date': '2024-02-05 00:00:00',
    'date_gmt': '2024-02-05 00:00:00',
    'content': 'Test Post <br/><a href="http://www.my-site.com/">related blog post</a>',
    'title': 'My second post',
    'excerpt': 'In this post, I will...',
    'status': 'publish',
    'comment_status': 'open',
    'ping_status': 'open',
    'password': 'my-post-pwd',
    'slug': 'my-second-post',    
}

Impostiamo la richiesta POST all’API e un comando per stampare lo stato della risposta:

r = requests.post(url + '/posts', headers=header, json=post)
print(r)

Eseguiamo lo script con il seguente comando nel terminale:

python app.py

Se abbiamo ricevuto una risposta 201 (“Creato”), significa che la risorsa è stata aggiunta con successo.

Schermata del terminale che riporta un codice di risposta 201 dopo la pubblicazione su WordPress tramite Python.
Un codice di risposta 201 viene restituito in caso di post riuscito.

Possiamo confermarlo nella dashboard di WordPress o nel database MySQL/MariaDB del sito.

Utilizzare la cache di Redis direttamente in WordPress

I siti WordPress possono utilizzare la cache di Redis per memorizzare temporaneamente oggetti come post, pagine o utenti. L’oggetto può poi essere richiamato dalla cache quando necessario. Questo approccio consente di risparmiare tempo prezioso, ridurre la latenza e migliorare la capacità del sito di scalare e gestire un traffico maggiore.

Redis per i clienti Kinsta

Un tempo di caricamento veloce è fondamentale per un’esperienza piacevole per l’utente e non c’è spazio per le prestazioni insufficienti. Ecco perché Kinsta offre Redis come add-on premium.

Per i clienti che desiderano usufruire dell’add-on Redis, è sufficiente contattare il supporto di Kinsta e ci occuperemo noi del processo di installazione e configurazione.

Installare un plugin Redis

Se non siete clienti Kinsta, dovrete installare un plugin dedicato sul vostro sito WordPress.

Ad esempio, installiamo il plugin Redis Object Cache su un sito WordPress locale.

Schermata: Selezione del plugin Redis Object Cache per l'installazione in WordPress.
Il plugin Redis Object Cache.

Apriamo il file wp-config.php in un editor di testo e aggiungiamo il seguente codice nella sezione delle variabili di configurazione personalizzate:

define('WP_REDIS_CLIENT', 'predis');
define('WP_REDIS_HOST', 'localhost');
define('WP_REDIS_PORT', '6379');

Nota: l’indirizzo dell’host Redis dipende dalla configurazione del server.

Andiamo su Impostazioni > Redis nella bacheca di WordPress. Dovremmo vedere qualcosa di simile a questo:

Schermata: Pagina delle impostazioni per il plugin Redis Object Cache in WordPress.
Il plugin Redis Object Cache viene visualizzato nella scheda Impostazioni.

La cache Redis ha ora sostituito con successo il precedente database MySQL.

Inoltre, il sito WordPress di frontend utilizza la stessa cache dell’applicazione Python di backend. Possiamo verificarlo aprendo un nuovo terminale ed eseguendo il comando:

redis-cli monitor

Mentre navighiamo nel sito, le richieste del sito web verranno visualizzate nel prompt dei comandi:

Schermata che mostra le richieste del server Redis all'interno del terminale.
Monitoraggio delle richieste del server nel terminale con redis-cli.

Ora che il front-end e il back-end sono sincronizzati, possiamo aggiungere un nuovo post a WordPress usando l’applicazione Python attraverso l’API REST.

Per farlo, modifichiamo l’oggetto POST in app.py per includere il nuovo post, quindi eseguiamo python app.py per aggiungere il post alla cache.

Riepilogo

In questo articolo abbiamo imparato a collegare un database Redis a un’applicazione Python utilizzando il client Redis Python. Questo client supporta diversi formati per gli archivi di dati Redis: liste, set, dizionari e altri tipi di dati di comando.

Abbiamo anche visto come integrare Redis in un sito WordPress tramite l’API REST e il plugin Redis Object Cache.

La possibilità di utilizzare la cache in-memory di Redis per un sito lo rende uno strumento di sviluppo potente e flessibile. Redis è straordinariamente efficace nel migliorare la velocità di interrogazione del database, le prestazioni del sito e l’esperienza generale dell’utente.

Bonus: potete chiedere a Kinsta di gestire l’installazione di Redis per il vostro sito WordPress. Inoltre, i fan di Redis troveranno il loro server preferito disponibile come implementazione autonoma nel servizio di Hosting di Database gestito di Kinsta.

Steve Bonisteel Kinsta

Steve Bonisteel is a Technical Editor at Kinsta who began his writing career as a print journalist, chasing ambulances and fire trucks. He has been covering Internet-related technology since the late 1990s.