Molte delle mie viste su Django iniziano un po 'in questo modo:
try:
# here request.POST could also be request.GET or a captured URL parameter
MyModel.objects.get(user = request.user, some_attr = int(request.POST['some_val']))
except KeyError:
# error_view is a view that returns a pretty, formatted 500 response
return error_view(request, message = 'Incomplete data was submitted (some_val was missing). No action was taken.', next = request.get_full_path())
except ValueError:
return error_view(request, message = 'The data (some_val = %s) was not formatted correctly. No action was taken.' % request.POST['some_val'], next = request.get_full_path())
except MyModel.DoesNotExist:
return error_view(request, message = 'The data you were looking for (some_val = %s) could not be found. It is possible you used an outdated form, or the data was just recently removed. No action was taken.' % request.POST['some_val'], next = request.get_full_path())
Mi trovo a ripetere un codice molto simile a questo (ma con diversi POST / GET / url, argomenti del filtro, tipo di dati, url o messaggi successivi), a volte diversi per una vista.
Qual è il modo migliore per avvicinarsi a questo?
- Continua a ripetere queste 8 righe, il codice è abbastanza diverso da non violare DRY
- Crea un decoratore che passa l'istanza alla vista o restituisce la visualizzazione dell'errore. Cambia la firma della funzione (ok?) E non così facile da generalizzare.
- Scrivi una funzione per farlo. In tal caso, dovrebbe ...
- ... restituisce una risposta o un'istanza, restituiscila se è una risposta.
- ... restituisce una tupla (istanza, risposta), oneo che è None, risintonizzando la risposta se non è None.
- ... genera un tipo speciale di eccezione (ad esempio VisibleException) e crea un middleware per visualizzarlo utilizzando
error_view
.
- ... qualcos'altro?
Tutti i metodi funzionano, ma quale consiglio e perché?
Mi è venuto in mente 3.3 proprio ora e per me ha senso - queste situazioni sono vie di uscita anormali dopo tutto - ma non penso di averlo mai visto prima (devo ammettere che non so cosa cercare per), quindi forse ha un problema. (Il programmatore che usa l'app deve aggiungere un middleware, questo è uno).
EDIT : mi è stato ricordato che get_object_or_404
genera un'eccezione che è visualizzata all'utente, quindi forse 3.3 è un'estensione logica.