2017-06-02 2 views
0

J'ai créer une fonction pour se connecter à un db qui imprime un « échec de la connexion à db » un message si aucune connexion est faite:impression à l'exception des messages dans les modèles de flacon via jinja2

def connectToDB(): 
     connectionString = 'dbname=reportingdb1 user=red_gui password=RadnfgoInd host=10.100.51.42' 
    try: 
    return psycopg2.connect(connectionString) 
    except: 
    print ("Failure to connect to db") 

Dans mon point de vue. py fichiers dans la section index, cette fonction est appelée immédiatement et dans mon environnement de test imprime l'instruction d'exception sauf dans mon terminal lorsque j'utilise délibérément les mauvaises informations d'identification pour la base de données (à des fins de test).

####Index Page 
@app.route('/', methods=['GET', 'POST']) 
@app.route('/index', methods=['GET', 'POST']) 
def index(): 
      connectToDB() 
      form = StaffNames() 
      if form.validate_on_submit(): 
        return redirect('/results') 
      return render_template('index.html',title='Search Page',form=form) 

Mon problème est, je veux imprimer ce message sur la page Web. J'ai essayé d'utiliser return au lieu de print et cela n'a pas fonctionné. J'ai aussi essayé d'essayer de stocker le message dans une exception variable, dans mes modèles/fichier index.html, appelez-le par jinja2 bouclés exemples de brackets.For J'essayées: à views.py

except: 
    noconnect = "Failure to connect to db" 

puis dans mon index.html:

{{ noconnect }} 

Mais cela aussi n'a pas fonctionné. Quelle serait la meilleure pratique pour le faire? Merci

Répondre

1

Simplifiez connectToDB pour qu'il ne se connecte qu'à la BD et rien d'autre.

def connectToDB(): 
    connectionString = 'dbname=reportingdb1 user=red_gui password=RadnfgoInd host=10.100.51.42' 
    psycopg2.connect(connectionString) 

Poignée exception potentiel dans la vue (mais sachez que la capture toutes exceptions ne sont pas une bonne pratique).

####Index Page 
@app.route('/', methods=['GET', 'POST']) 
@app.route('/index', methods=['GET', 'POST']) 
def index(): 
    exception = None 
    try: 
     connectToDB() 
    except: 
     exception = 'Failure to connect to db' 

    form = StaffNames() 
    if not exception: 
     if form.validate_on_submit(): 
      return redirect('/results') 

    return render_template('index.html',title='Search Page', form=form, exception=exception) 

place {{ exception }} quelque part dans votre index.html

+0

Merci, mais je reçois erreur 'variable locale' forme 'référencé avant l'affectation » – nmh

+0

Juste pour ajouter, cela ne se produit que lorsque je saisis délibérément le mauvais mot de passe pour le db- l'ensemble de l'application virtualenv échoue à ce stade. Cela signifie que je ne peux pas réellement regarder la page d'index pour voir si l'erreur de connexion à DB que j'ai essayé de générer apparaît. L'application échoue plutôt que de me dire simplement que je ne peux pas me connecter à la base de données. Comment puis-je empêcher l'application de tomber sur chaque connexion infructueuse à la base de données? – nmh

+1

En fait, je l'ai mis au point, le 'form = StaffNames()' devait être en dehors de l'instruction 'if', donc je l'ai placé directement après' def index(): 'et cela a fonctionné. Je vais accepter votre réponse (comme c'était parfait sinon!) Si vous changez ce peu. – nmh

0

Les frameworks Web nécessitent généralement que les objets soient transmis via le contexte aux vues et aux modèles. Vous devez passer les objets dans le render_template:

. . . 

error = connectToDB() 

return render_template('index.html', title='Search Page', 
         form=form, error=error) 

Ensuite, dans votre modèle, utilisez: {{ error }}

Une autre façon de faire qui est plus Django comme est de créer un dictionnaire pour vos données:

error = 'error message' 
test = 'test' 

. . . 

data = { 
    'error': error, 
    'test': test 
} 

Ensuite, retournez votre render_template comme ceci:

return render_template('index.html', title='Search Page', 
         form=form, **data) 

Les étoiles doubles font en sorte que vous pouvez toujours le faire: {{ error }}. Sinon, vous devrez faire ceci: {{ data.error }}

+0

Merci je vais essayer ce, mais pourriez-vous expliquer quelque chose à moi, donc je comprends. Pourquoi 'error = connectToDB()' ne fait-il pas simplement d'erreur 'une variable contenant la fonction connectToDB()? – nmh

+0

J'ai essayé, mais il ne s'agit que d'imprimer "None" sur ma page Web où j'ai placé le {{error}}. Cela n'indique pas que la base de données ne peut pas être atteinte malgré que j'aie entré les mauvaises références. – nmh

+0

'error = connectToDB()' donne un nom aux valeurs renvoyées par l'appel de cette fonction. Si la connexion DB réussit, vous obtiendrez ce que cela vous donnera, 'psycopg2.connect (connectionString)'. Si cela échoue, vous obtiendrez le message d'erreur, comme vous le souhaitez.Compte tenu de ces informations, vous pourriez envisager de refactoriser votre fonction 'connectToDB', car vous n'aurez peut-être pas besoin de renvoyer cet objet' psycopg2' à votre vue. – nicorellius