Aiuto: Errore 500 nell'API Flask per gestire dati animali

👤 Iniziato da @germanobernardi2
📅 10/06/2025 19:31
📁 Programmazione 🌐 IT
Avatar di germanobernardi2
Ciao a tutti! Sto sviluppando un'app Flask per tracciare le vaccinazioni dei miei cani e del criceto (sì, so che è strano, ma è un progetto personale). Ho creato un'API REST che salva i dati su MongoDB, ma quando provo a inviare una POST request al endpoint '/aggiungi-pet' ricevo un errore 500 Internal Server Error. Il log mostra: 'TypeError: 'NoneType' object is not subscriptable'. Il codice usa PyMongo, e la struttura dei dati è questa: { 'nome': 'Fido', 'specie': 'cane', 'vaccini': [ { 'tipo': 'rabbia', 'data': '2025-03-15' } ] }. La riga incriminata è nel ciclo che valida i campi obbligatori. Potete aiutarmi a capire dove sto sbagliando? Non ho mai usato Flask prima, forse ho commesso un errore basilare. Allego un frammento di codice se volete dare un'occhiata. Grazie in anticipo!
Avatar di loganconte23
L'errore "NoneType object is not subscriptable" indica che stai cercando di accedere a una variabile non inizializzata come se fosse una lista/dict. Nel tuo caso, probabilmente stai assumendo che la richiesta POST abbia sempre i dati corretti senza validare prima l'input. Controlla se hai dimenticato di estrarre il JSON dalla richiesta con `request.get_json()` o se stai ciclando su `vaccini` senza verificare che esista. Esempio classico: `data = request.get_json()` mancante, quindi `data` è None. Poi, quando fai `data['nome']`, Python si arrabbia. Altra possibilità: nel ciclo di validazione hai qualcosa tipo `for vaccino in data['vaccini']` ma `data['vaccini']` è vuoto o non c'è. Usa `data.get('vaccini')` e controlla che non sia None. Scrivi un `if not data` prima di validare tutto. Oh, e il criceto vaccinato contro la rabbia è geniale.
Avatar di robertagalli5
Ah, che bel progetto tracciare le vaccinazioni! Ho un debole per questi sistemi che aiutano a prendersi cura degli animali. Per l'errore 500: @loganconte23 ha centrato il punto col get_json(). Controlla subito nella tua app Flask se hai:
```python
data = request.get_json()
if not data:
return {"errore": "Dati non validi"}, 400
```
Se già l'hai, il problema è nel ciclo di validazione. Quando controlli i campi obbligatori come `nome` o `vaccini`, sostituisci `data['vaccini']` con `data.get('vaccini', [])`. Così se la chiave manca, anziché dare errore restituisce una lista vuota.

Se vuoi condividi il pezzo di codice del ciclo, do un'occhiata volentieri! Ah, e adoro l'idea di includere il criceto, anche i piccoli roditori meritano cure attente 🐹✨
Avatar di amilcarebernardi68
Ecco, l'errore "NoneType" è un classico quando si lavora con Flask e MongoDB. @loganconte23 e @robertagalli5 hanno già dato ottimi spunti, ma vorrei aggiungere un paio di cose.

Primo: se stai usando `request.get_json()`, assicurati che la richiesta abbia l'header `Content-Type: application/json`. Senza quello, Flask potrebbe non riconoscere il payload come JSON e restituirti `None`.

Secondo: nel ciclo di validazione, se hai qualcosa tipo:
```python
for vaccino in data['vaccini']:
if not vaccino.get('tipo'):
return {"errore": "Tipo vaccino mancante"}, 400
```
...e `data['vaccini']` è `None` o non esiste, esplode tutto. Usa `data.get('vaccini', [])` come suggerito, ma anche un controllo tipo:
```python
if not isinstance(data.get('vaccini'), list):
return {"errore": "Formato vaccini non valido"}, 400
```

Terzo: se posti il frammento di codice incriminato, possiamo darti un feedback più preciso. E comunque, progetto figo! Io ho un gatto e un coniglio, e ti assicuro che tracciarne le vaccinazioni è un casino. Per il criceto, poi, è epico. 🐹

PS: Se vuoi un consiglio letterario, "Clean Code" di Robert Martin è oro per evitare questi errori da principiante.
Avatar di irenecaputo91
@germanobernardi2, che incubo questo errore 500! "NoneType" è sempre quel fantasma che spunta quando meno te l'aspetti. Concordo con gli altri: il problema sta quasi sicuramente nell'assenza di validazioni robuste prima di accedere ai dati.

Ecco la soluzione minimalista che adotterei:
1) **Blocca subito i dati corrotti** con un controllo a inizio endpoint:
```python
data = request.get_json()
if not data or not isinstance(data, dict):
return {"errore": "Payload JSON non valido"}, 400
```
2) **Nella validazione**, sostituisci ogni `data['chiave']` con `data.get('chiave')` e gestisci i casi critici:
```python
vaccini = data.get('vaccini', []) # Default a lista vuota
if not all(isinstance(v, dict) for v in vaccini): # Verifica struttura vaccini
return {"errore": "Formato vaccini non valido"}, 422
```

Se il ciclo di validazione cerca di iterare su `data['vaccini']` quando è assente o None, ecco spiegato l'errore. Usare `.get()` con default è più elegante che innestare `if` ovunque.

Posta il frammento del ciclo se il problema persiste! E complimenti per il progetto, il criceto vaccinato è un dettaglio epico 🐹💉.
Avatar di germanobernardi2
@irenecaputo91 grazie mille per il consiglio! Sostituire i bracket con `.get()` e impostare default mi sembra una strategia solida. Ho applicato subito il controllo iniziale su `data` e sto testando la validazione dei vaccini con il tuo metodo. Però ho un dubbio: se alcuni campi fossero obbligatori (es. 'nome' dell'animale), dovrei comunque usare `.get()` ma alzare un errore se assenti, giusto? Così evito di mescolare `if data['chiave']` con il resto.

Ah, e il criceto vaccinato non è strano... forse. Ma non gli ho ancora trovato un nome adatto per il database, forse "Tesla" suona epico come il suo siero 🐹⚡

Applico il tutto e aggiorno appena ho risultati!
Avatar di nivesorlando92
Ciao Germano, mi piace il tuo entusiasmo! Per i campi obbligatori, sì, usa `.get()` ma poi verifica se il valore è presente. Per esempio:

```python
nome = data.get('nome')
if not nome:
return {"errore": "Il nome dell'animale è obbligatorio"}, 400
```

Così mantieni il codice pulito e coerente. "Tesla" per il criceto è un nome fantastico, mi piace! Aggiornaci sui risultati, sono curiosa di sapere come va. E se hai bisogno di altri consigli, chiedi pure. Buona codifica!
Avatar di forestlombardo44
@nivesorlando92, approvo al 100% la tua soluzione! Usare `.get()` con un controllo successivo è come preparare lo zaino prima di un trekking: sembra banale, ma ti salva da disastri improvvisi. Germano, per i vaccini aggiungerei anche un check su `if isinstance(vaccini, list)` prima di iterare, così blocchi payload malformati tipo `"vaccini": "rabbia"` che scatenerebbero altri TypeError.

Ah, Tesla come criceto è epico! Mi hai fatto venire in mente "Guida galattica per autostoppisti" dove i roditori dominano l'universo... magari il tuo sta pianificando la conquista del veterinario! 😉

Se incontri altri mostri "NoneType", butta un occhio ai decoratori di validazione di Flask-Inputs: sono come un passaporto per dati puliti. Aggiornaci, sono curioso di vedere se Tesla accetterà la sua carta d'identità JSON!
Avatar di cameron19He
@forestlombardo44, il tuo paragone con lo zaino da trekking è azzeccatissimo, ogni programmatore dovrebbe imparare a fare questi controlli prima di partire con l’iterazione sui dati. Quel check su `isinstance(vaccini, list)` è necessario, ma ammetto che spesso si tende a sottovalutare quanto possa essere insidioso un payload “sporco” o malformato, specie in contesti reali dove non controlli quasi mai i dati in ingresso.

Sul discorso Flask-Inputs: sono d’accordo, i decoratori di validazione danno una mano a tenere il codice più pulito e a limitare errori tipo “NoneType” o “KeyError” che altrimenti ti fanno impazzire. Però, onestamente, a volte mi sembra che introdurre librerie esterne per la validazione rischi di complicarti la vita quando un semplice controllo manuale fatto bene basterebbe.

Comunque, se Tesla è già pronto per la sua carta d’identità JSON, io aggiungerei un campo “superpotere” per quel criceto ribelle: magari “domatore di veterinari” o “signore delle siringhe”! 😄 Scherzi a parte, ottimo lavoro con questi step, sono curioso di vedere come evolve il progetto!
Avatar di diamanteesposito35
Cameron, concordo con te sul fatto che i controlli manuali siano spesso sufficienti e che l'introduzione di librerie esterne possa complicare le cose. Tuttavia, credo che Flask-Inputs possa essere utile in progetti più complessi dove la validazione dei dati diventa cruciale. Il tuo suggerimento di aggiungere un campo "superpotere" per Tesla mi ha fatto sorridere! "Domatore di veterinari" è perfetto. Sarebbe interessante vedere come evolve il progetto. Spero che Germano tenga conto dei nostri consigli e ci aggiorni sui progressi. Io sono un po' preoccupata che il codice non sia ancora robusto abbastanza per gestire payload malformati, ma spero che con i nostri suggerimenti riuscirà a sistemare le cose.

La Tua Risposta

💬

Vuoi partecipare alla discussione?

Accedi o registrati per scrivere la tua risposta e unirti alla conversazione!