Kau*_*ana 7 sqlalchemy flask python-3.x flask-sqlalchemy
我需要连接两个数据库.默认数据库是固定的,但另一个是动态的,它基于URL.
例如,如果url是:yourapp.myweb.com,那么第二个数据库名称将是yourapp
我尝试将数据库连接到init .py但它显示我跟随错误
builtins.AssertionError
AssertionError: A setup function was called after the first request was handled. This usually indicates a bug in the application where a module was not imported and decorators or other functionality was called too late.
To fix this make sure to import all your view modules, database models and everything related at a central place before the application starts serving requests.
Run Code Online (Sandbox Code Playgroud)
这是我的init .py
from flask import Flask,session
from flask_sqlalchemy import SQLAlchemy
import os
app = Flask(__name__,static_url_path='/static')
# Database Connection
database = request.url.split("/")[2].split(".")[0]
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:root@localhost/main_database"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
app.config['SQLALCHEMY_BINDS'] = {
'user_db': 'mysql+pymysql://root:root@localhost/database_'+str(database), #dynamic Connection
}
db = SQLAlchemy(app)
db.create_all()
db.create_all(bind=['user_db'])
# db.init_app(app)
from . import views
Run Code Online (Sandbox Code Playgroud)
这是viwe.py
@app.route('/login', methods = ['GET'])
def index():
try:
from .model import Users
# Some Code
except Exception as e:
raise e
# return "Failed to login ! Please try again."
Run Code Online (Sandbox Code Playgroud)
这是model.py
from application import db
class Users(db.Model):
__bind_key__ = 'user_db'
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key = True)
email = db.Column(db.String(50))
name = db.Column(db.String(50))
password = db.Column(db.String())
def __repr__(self):
return '<User %r>' % self.name
Run Code Online (Sandbox Code Playgroud)
正如我在评论中所说,这可能是数据库连接的问题。这是我要检查的内容:
首先,确保您的虚拟环境中安装了正确的引擎(您可以通过运行轻松检查pip list;为了以防万一,让我坚持认为库需要安装在虚拟环境中)。确保您没有pymysql,但有 Python3 的端口,称为mysqlclient。pymysql仅适用于 Python2。为了安装这个库,您需要首先安装Python和MySQL开发头文件。例如,在 Debian/Ubuntu 中:
sudo apt-get install python-dev libmysqlclient-dev
Run Code Online (Sandbox Code Playgroud)
然后您可以使用以下命令安装该库:
pip install mysqlclient
Run Code Online (Sandbox Code Playgroud)如果已安装,请确保您实际上可以使用该库连接到数据库。在虚拟环境中打开 Python shell 并输入以下内容(来自github中的示例):
import pymysql.cursors
connection = pymysql.connect(host='<you_host>',
user='<user>',
password='<password>',
db='<database_name>',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
try:
with connection.cursor() as cursor:
do_something()
except:
pass
Run Code Online (Sandbox Code Playgroud)如果这有效,请确保您正在运行最新版本的 Flask(目前为 0.12;您可以再次通过运行来检查pip list),因为有几个与在 DEBUG 模式下运行 Flask 相关的错误已随着时间的推移而得到修复。
这里肯定不是这种情况,但另一个健全性检查是验证您想要用于 Flask 的端口上是否没有其他进程正在运行。
如果上述所有内容都工作正常,我需要查看一些堆栈跟踪来弄清楚实际发生了什么。
| 归档时间: |
|
| 查看次数: |
1284 次 |
| 最近记录: |