Flask + MySQL奇怪的行为

时间:2015-04-08 12:25:32

标签: python mysql flask

我正在构建一个使用现有MySQL数据库的简单网络应用程序。这是我第一次使用Flask,我一直在努力去理解过去几个小时里我做错了什么。

我简单的项目结构:

/root
/app
  __init__.py
  db.py
  forms.py
  views.py
  /templates
   base.html
   index.html
   login.html
config.py
run.py

我正在尝试查询我的MySQL数据库并使用查询结果填充模板。

我的db.py:

from app import app
from flaskext.mysql import MySQL


class DB(object):
    mysql = MySQL()

    def __init__(self):
        app.config['MYSQL_DATABASE_USER'] = 'loguser'
        app.config['MYSQL_DATABASE_PASSWORD'] = 'asdzxc'
        app.config['MYSQL_DATABASE_DB'] = 'log'
        app.config['MYSQL_DATABASE_HOST'] = '127.0.0.1'
        app.config['MYSQL_DATABASE_PORT'] = 33006
        self.mysql.init_app(app)

    def query_db(self):
        cursor = self.mysql.connect().cursor()
        cursor.execute("SELECT name from users limit 1")
        data = cursor.fetchone()
        if data is None:
            return "No results from query"
        else:
            return data

在我的views.py中,我有以下内容:

from flask import render_template, flash, redirect
from app import app
from .forms import LoginForm
from .db import DB

@app.route('/')
@app.route('/index')
def index():
    db = DB()
    user = db.query_db()
    print(user) (it prints it here so the db connection works)


    posts = [  # fake array of posts
        {
            'author': {'nickname': 'John'},
            'body': 'Beautiful day in Portland!'
        },
        {
            'author': {'nickname': 'Susan'},
            'body': 'The Avengers movie was so cool!'
        }
    ]
    return render_template("index.html",
                           title='Home',
                           user=user,
                           posts=posts)

我得到了#34; AssertionError"当我尝试分配"用户"从模板到用户:

  

AssertionError:在处理第一个请求后调用了一个setup函数。这通常表示应用程序中未导入模块且装饰器或其他功能被调用太晚的错误。要解决此问题,请确保在应用程序开始服务之前导入所有视图模块,数据库模型以及中央位置的所有相关内容。请求。

我认为我违反了框架的主要原则。将数据传递给模板的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

最好使用Flask-SQLAlchemy和MySQL-python 1.2,下面的链接提供了成功的代码和文档。

http://techarena51.com/index.php/flask-sqlalchemy-tutorial/

根据我的经验,我发现MySQl支持对python 3至少不太好,最好使用PostgreSQL,但这只是我个人的看法。

答案 1 :(得分:0)

现在回答已经很晚了,但它可能对某人有帮助。

在将任何路由源添加到API之前,您必须连接到MySQL

它应该是

的顺序
# 1. MySQL setup should be done at first
app = Flask(__name__)
api = Api(app)
mysql = MySQL()

app.config['MYSQL_DATABASE_USER'] = 'root'
app.config['MYSQL_DATABASE_PASSWORD'] = 'root'
app.config['MYSQL_DATABASE_DB'] = 'DataBase'
app.config['MYSQL_DATABASE_HOST'] = 'localhost'
mysql.init_app(app)
conn = mysql.connect()
cursor = conn.cursor()

# 2. Create API resource after that
api.add_resource(CreateUser, '/CreateUser')