2017-10-09 13 views
-1

dans mon application flask J'utilise mongoDB et sur la page d'accueil j'ai un formulaire qui retourne toutes les collections connues dans cette base de données particulière. Je demande à l'utilisateur de choisir une collection qu'il souhaite utiliser car j'utiliserai cet ensemble de collections pour retourner tous les documents dans d'autres itinéraires ou vues.flask database variable globale

J'ai du mal à faire en sorte que cette collection "selected_collection" globale soit une variable globale que toutes les routes et vues peuvent utiliser. Par exemple sur la page d'index je suis capable de sélectionner une collection puis sur le soumettre il me redirigerait pour voir db_selected là j'essayais de faire de la collection selected_collection une variable globale mais si j'arrivais à la vue about elle obtenait une erreur lié à

J'imagine que je devrais utiliser flask.g mais je ne sais pas comment le faire fonctionner. J'ai lu certains documents mais ils sont un peu vagues pour moi.

AttributeError: '_AppCtxGlobals' object has no attribute 'selected_collection' 

Comment puis-je faire ce travail?

fichier app.py:

# INDEX 
@app.route('/', methods=['GET', 'POST']) 
def index(): 

    coll_name = get_db_collection() 

    return render_template('index.html', coll_name=coll_name) 


# LOGIN 
@app.route('/db_selected', methods=['GET', 'POST']) 
def db_selected(): 

    if request.method == 'POST': 
     selected_collection = request.form['Item_4'] 
     selected_collection = g.selected_collection 

     return render_template('db_selected.html', 
     selected_collection=selected_collection) 


@app.route('/about') 
def about(): 

    app.logger.info('selected_collection is {}'.format(g.selected_collection)) 

    return render_template('about.html') 

fichier index.html:

{%extends 'layout.html'%} 

{%block body%} 
<div class="jumbotron text-center"> 
    <h1>Welcome to the index.html file !</h1> 
</div> 

<div class="container"> 
    {% include 'db_query_bar.html' %} 
</div> 

{%endblock%} 

db_query_bar.html

<form class="form-horizontal" action="{{ url_for('db_selected') }}" name="Item_1" method="POST"> 
    <fieldset> 
    <legend>Select DB</legend> 
    <div class="form-group"> 
    <label for="select" class="col-lg-2 control-label">Database Collection:</label> 
    <select id="DB" class="form-control" name="Item_4" style="width: 70%" > 
     <!-- <option value="">All</option> --> 
     {% for item in coll_name %} 
      <option value="{{item}}">{{item}}</option> 
     {% endfor %} 
    </select> 
    <br> 
</div> 
<div class="form-group"> 
    <div class="col-lg-10 col-lg-offset-2"> 
    <button type="submit" class="btn btn-success">Submit</button> 
    </div> 
</div> 
</fieldset> 
</form> 

Répondre

0

Juste pour répondre à cela pour la variable globale j'ai fini par placer

app.selected_collection = "Some Value" 

en haut du code de mon flacon ceci va créer une variable globale que je peux utiliser dans toutes les vues.

app = Flask(__name__) 

# CONFIG MONGO CONNECTION DETAILS 
app.config['MONGO_HOST'] = 'DB-Host' 
app.config['MONGO_DBNAME'] = 'DB-Collection' 

app.selected_collection = "Some Value" 

# INIT MONGODB 
mongo = PyMongo(app)