2017-06-20 1 views
-1

Je construis un site web avec Python/Flask/MySQL sur la plate-forme PythonAnywhere. J'ai déjà travaillé avec la base de données (lire: les connexions db ne sont pas demandées ici, c'est l'installation/configuration et l'appel), mais je veux changer cela pour être plus en ligne avec le développement Web (application/requête) Contextes).Problème lors de l'implémentation des états de connexion à la base de données avec Python/Flask/MySQL

J'ai eu quelques tentatives de différentes configurations basées sur la documentation et d'autres messages (comme celui-ci: Connect to a Database in Flask, Which Approach is better?). Bien que très instructif, j'ai toujours du mal à le mettre en œuvre avec succès et j'espère que quelqu'un pourra vous expliquer pourquoi cela ne fonctionne pas.

J'essaie de garder les choses simples ont tout fait à l'heure actuelle dans un fichier MyApp.py, qui ressemble à ceci:

from flask import Flask, render_template, session, request, redirect, url_for, g 
from flask.ext.mysql import MySQL 

app = Flask(__name__, static_url_path='') 
app.config["DEBUG"] = True 

def get_db(): 
    db = getattr(g, '_database', None) 
    if db is None: 
     db = g._database = connect_to_database() 
    return db 

@app.teardown_appcontext 
def teardown_db(exception): 
    db = getattr(g, '_database', None) 
    if db is not None: 
     db.close() 

def connect_to_database(): 
    mysql = MySQL() 
    app.config['MYSQL_DATABASE_USER'] = '{db_user}' 
    app.config['MYSQL_DATABASE_PASSWORD'] = '{db_password}' 
    app.config['MYSQL_DATABASE_DB'] = '{db}' 
    app.config['MYSQL_DATABASE_HOST'] = '{dbhost}' 
    dbcon = mysql.connect() 
    return dbcon 

@app.route('/', methods=["GET", "POST"]) 
def index(): 
    db_conn = get_db() 
    cursor = db_conn.cursor() 
    #... do my SQL stuff here ...# 
    return render_template("home_guest.html") 

Il échoue lorsqu'il atteint la fonction mysql.connect() et Je ne peux pas comprendre pourquoi. Voici les journaux d'erreurs du serveur Python Anywhere:

2017-06-20 02:03:23,228: Error running WSGI application 
2017-06-20 02:03:23,230: AttributeError: 'NoneType' object has no attribute 'config' 
2017-06-20 02:03:23,230: File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 2000, in __call__ 
2017-06-20 02:03:23,230:  return self.wsgi_app(environ, start_response) 
2017-06-20 02:03:23,231: 
2017-06-20 02:03:23,231: File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1991, in wsgi_app 
2017-06-20 02:03:23,231:  response = self.make_response(self.handle_exception(e)) 
2017-06-20 02:03:23,231: 
2017-06-20 02:03:23,231: File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1567, in handle_exception 
2017-06-20 02:03:23,232:  reraise(exc_type, exc_value, tb) 
2017-06-20 02:03:23,232: 
2017-06-20 02:03:23,232: File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1988, in wsgi_app 
2017-06-20 02:03:23,232:  response = self.full_dispatch_request() 
2017-06-20 02:03:23,232: 
2017-06-20 02:03:23,232: File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1641, in full_dispatch_request 
2017-06-20 02:03:23,232:  rv = self.handle_user_exception(e) 
2017-06-20 02:03:23,232: 
2017-06-20 02:03:23,232: File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1544, in handle_user_exception 
2017-06-20 02:03:23,233:  reraise(exc_type, exc_value, tb) 
2017-06-20 02:03:23,233: 
2017-06-20 02:03:23,233: File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1639, in full_dispatch_request 
2017-06-20 02:03:23,233:  rv = self.dispatch_request() 
2017-06-20 02:03:23,233: 
2017-06-20 02:03:23,233: File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1625, in dispatch_request 
2017-06-20 02:03:23,233:  return self.view_functions[rule.endpoint](**req.view_args) 
2017-06-20 02:03:23,233: 
2017-06-20 02:03:23,233: File "/home/WazzalJohn/mysite/flask_app.py", line 83, in login 
2017-06-20 02:03:23,234:  conn = get_db() 
2017-06-20 02:03:23,234: 
2017-06-20 02:03:23,234: File "/home/WazzalJohn/mysite/flask_app.py", line 15, in get_db 
2017-06-20 02:03:23,234:  db = g._database = connect_to_database() 
2017-06-20 02:03:23,234: 
2017-06-20 02:03:23,234: File "/home/WazzalJohn/mysite/flask_app.py", line 40, in connect_to_database 
2017-06-20 02:03:23,234:  dbcon = mysql.connect() 
2017-06-20 02:03:23,234: 
2017-06-20 02:03:23,235: File "/home/WazzalJohn/.local/lib/python2.7/site-packages/flaskext/mysql.py", line 39, in connect 
2017-06-20 02:03:23,235:  if self.app.config['MYSQL_DATABASE_HOST']: 

Toute suggestion ou aide serait appréciée, merci.

+0

Les documents Flask-MySQL expliquent exactement comment l'utiliser. http://flask-mysqldb.readthedocs.io/en/latest/ – davidism

Répondre

2

Vous devez appeler init_app pour initialiser l'application à utiliser avec la classe MySQL. Ensuite, accédez à la connexion depuis l'extension. Cela ne va pas dans une fonction.

mysql = MySQL() 
app.config['MYSQL_DATABASE_USER'] = '{db_user}' 
app.config['MYSQL_DATABASE_PASSWORD'] = '{db_password}' 
app.config['MYSQL_DATABASE_DB'] = '{db}' 
app.config['MYSQL_DATABASE_HOST'] = '{dbhost}' 
mysql.init_app(app) 

@app.route('/') 
def index(): 
    c = mysql.connection.cursor() 
    ... 
+0

Et vous ne le faites pas non plus dans une fonction, l'extension est globale. L'enregistrer plusieurs fois posera des problèmes. – davidism

+0

Maintenant, le journal des erreurs est: 2017-06-20 04: 41: 03,704: Erreur lors de l'exécution de l'application WSGI 2017-06-20 04: 41: 03,708: AssertionError: Une fonction de configuration a été appelée après la première demande a été traitée. Cela indique généralement un bogue dans l'application où un module n'a pas été importé et les décorateurs ou autres fonctionnalités ont été appelés trop tard. 2017-06-20 04: 41: 03,712: fichier "/home/WazzalJohn/mysite/flask_app.py", ligne 38, dans connect_to_database 2017-06-20 04: 41: 03,712: mysql.init_app (app) – WazzalJohn

+0

Salut davidism. Merci pour votre réponse, mais à quelle ligne faites-vous exactement référence? Pourriez-vous élaborer et me montrer comment cela devrait être mis en place? – WazzalJohn