Come dovrei validate HTML nei modelli di Django durante il processo di sviluppo?
-
28-09-2019 - |
Domanda
Non ho usato Django e Python di incorporato in fase di test ancora capacità, ma voglio iniziare finalmente ... E una delle cose più evidenti che mi piacerebbe tenere sotto controllo durante l'intero processo di sviluppo è che tutti le mie pagine convalidano in tutti gli scenari possibili.
Qual è il modo migliore per fare questo?
Soluzione
Buona domanda. Non ho fatto io stesso, quindi speriamo che ci saranno alcune risposte migliori, ma si potrebbe desiderare di guardare in HTML convalida middleware:
- http://djangosnippets.org/snippets/1312/
- http://lukeplant.me.uk/resources/djangovalidator/
- http://bstpierre.org/Projects/HtmlValidatorMiddleware/
“in tutti gli scenari possibili” potrebbe essere troppo da chiedere, a seconda della vostra applicazione. Per esempio, se si effettua il prossimo Facebook, e state accettando in tal modo enormi quantità di dati degli utenti ogni giorno, qualcosa verrà a un certo punto che rompe la validità di una pagina del tuo sito.
Come gli errori di convalida non tendono a distruggere la funzionalità, potrebbe essere un approccio accettabile per controllare con alcuni dati di test limitati, quindi reagire a errori come si presentano. Credo che questo è noto come stupidità-driven test .
Altri suggerimenti
In alternativa, un approccio roll-your-own per convalidare le pagine del tuo sito durante il consueto processo di test unità sarebbe simile a questa:
- Vai attraverso il vostro
urls.py
e generare il maggior numero possibile di URL per il sito, come si può - il built-in client di prova Django a prendere ciascuno di tali URL
- Convalida loro in qualche modo (vedere forse Convalida (X) HTML in Python )
Non so se qualcuno ha fatto alcun lavoro su questo è un modo riutilizzabile.
Una soluzione è quella di fare uno script che rende tutti i modelli basati su un dizionario di input di valori variabili di test.
La logica principale per recuperare l'elenco delle variabili definite nei modelli è il seguente:
from django.template.loader import get_template
def extract_required_vars(node):
if not hasattr(node, 'nodelist'):
return []
var_names = []
for child_node in node.nodelist:
if isinstance(child_node, VariableNode):
var_names.append(child_node.filter_expression.token)
elif isinstance(child_node, ForNode):
var_names.append(child_node.sequence.var.var)
elif isinstance(child_node, ExtendsNode):
template = get_template(child_node.parent_name.var)
var_names.extend(extract_required_vars(template))
elif isinstance(child_node, IncludeNode):
template = get_template(child_node.template.var)
var_names.extend(extract_required_vars(template))
var_names.extend(extract_required_vars(child_node))
return var_names
required_vars = extract_required_vars(get_template('index.html'))
Lo script quindi verifica che le variabili definite nei modelli sono sia nelle impostazioni del progetto o nel dict fornito dall'utente come input di prova.
/path/to/project/templates/templates/allusers.html
-> ok: users, STATIC_URL
/path/to/project/templates/entrer-en-contact.html
-> ok: contactform, STATIC_URL
/path/to/project/templates/dest-summary.html
-> ok: STATIC_URL
-> missing: dest_username