2017-06-20 91 views
-1

我正在PythonAnywhere平臺上用Python/Flask/MySQL構建一個網站。我以前曾經和DB一起工作過(閱讀:db連接不是這裏的問題,它是設置/配置和調用),但是我想改變它以更符合Web開發(即應用程序/請求上下文)。使用Python/Flask/MySQL實現數據庫連接狀態時遇到困難

根據文檔和其他帖子(例如這個:Connect to a Database in Flask, Which Approach is better?),我已經嘗試過不同的配置。雖然信息量很大,但我仍然無法成功實施,希望有人能指出爲什麼它不起作用。

我試圖讓事情變得簡單,所以有一個MyApp.py文件,此刻的一切,它看起來像這樣:

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") 

它,當它到達mysql.connect()函數和失敗我無法弄清楚爲什麼。以下是來自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']: 

任何建議或幫助,將不勝感激,謝謝。

+0

Flask-MySQL文檔解釋瞭如何使用它。 http://flask-mysqldb.readthedocs.io/en/latest/ – davidism

回答

2

您必須致電init_app才能初始化該應用以用於MySQL類。然後從擴展中訪問連接。這不會進入功能。

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

而且你也不這樣做,在一個函數中,擴展名是全局的。多次註冊會導致問題。 – davidism

+0

現在,錯誤日誌是: 2017-06-20 04:41:03,704:運行WSGI應用程序時出錯 2017-06-20 04:41:03,708:AssertionError:在處理第一個請求後調用了一個設置函數。這通常表示應用程序中沒有導入模塊並且裝飾器或其他功能被調用太遲的錯誤。 2017-06-20 04:41:03,712:文件「/home/WazzalJohn/mysite/flask_app.py」,第38行,在connect_to_database中 2017-06-20 04:41:03,712:mysql.init_app(app) – WazzalJohn

+0

嗨大衛主義。感謝您的回覆,但您提到的是哪一行?你能否詳細說明並告訴我應該如何設置? – WazzalJohn

相關問題