下面是Python Flask代码。
我想做的就是将代码分成不同的文件,如下所示 view.py 中的所有路由,在 db.py 中配置 db 并在 app.py 或任何需要的地方使用它们。
我还想在某些路由中使用db,那么如何在views.py中调用它
from flask import Flask, render_template, request, redirect, make_response, jsonify
from flask_mysqldb import MySQL
from flask_cors import CORS, cross_origin
import yaml
app = Flask(__name__)
# middleware
cors = CORS(app)
# configure db
db = yaml.safe_load(open('db.yaml'))
app.config['MYSQL_HOST'] = db['mysql_host']
app.config['MYSQL_USER'] = db['mysql_user']
app.config['MYSQL_PASSWORD'] = db['mysql_password']
app.config['MYSQL_DB'] = db['mysql_db']
mysql = MySQL(app)
# routes
@app.route("/", methods=['POST'])
def index():
cur = mysql.connection.cursor()
sql_select_query_check = """UPDATE users SET Password = %s, Password_Status = %s WHERE ID = %s"""
cur.execute(sql_select_query_check, (hashcode, 1, userid[0]))
mysql.connection.commit()
return jsonify({"message": "password updated"})
if __name__ == '__main__':
app.run(debug=True, use_reloader=True)
最佳答案
在flask
文档中您可以看到Larger Applications它显示了如何拆分代码。它提到主要问题可能是循环导入 - main
导入 views
,它必须导入 main
才能获取 app
。同样的问题是 db.py
,它需要导入 main
才能获取 app
我将 app
移动到单独的文件 application.py
以跳过循环导入
我不运行代码,也许需要将 mysql
导入 views.py
但也许应该使用 Blueprint()
或使用将导入到 main.py
并使用参数 app
运行的函数来完成.
application.py
from flask import Flask
app = Flask(__name__)
db.py
from application import app
from flask_mysqldb import MySQL
import yaml
db = yaml.safe_load(open('db.yaml'))
app.config['MYSQL_HOST'] = db['mysql_host']
app.config['MYSQL_USER'] = db['mysql_user']
app.config['MYSQL_PASSWORD'] = db['mysql_password']
app.config['MYSQL_DB'] = db['mysql_db']
mysql = MySQL(app)
views.py
from application import app
@app.route("/", methods=['POST'])
def index():
cur = mysql.connection.cursor()
sql_select_query_check = """UPDATE users SET Password = %s, Password_Status = %s WHERE ID = %s"""
cur.execute(sql_select_query_check, (hashcode, 1, userid[0]))
mysql.connection.commit()
return jsonify({"message": "password updated"})
main.py
from application import app
from flask import render_template, request, redirect, make_response, jsonify
from flask_cors import CORS, cross_origin
from views import *
# middleware
cors = CORS(app)
if __name__ == '__main__':
app.run(debug=True, use_reloader=True)
编辑:
在函数 init()
中包含代码且没有 application.py
的版本 - 但我没有测试它是否有效。但它开始看起来像带有 Blueprint
db.py
from flask_mysqldb import MySQL
import yaml
def init(app):
db = yaml.safe_load(open('db.yaml'))
app.config['MYSQL_HOST'] = db['mysql_host']
app.config['MYSQL_USER'] = db['mysql_user']
app.config['MYSQL_PASSWORD'] = db['mysql_password']
app.config['MYSQL_DB'] = db['mysql_db']
return MySQL(app)
views.py
def init(app, mysql):
@app.route("/", methods=['POST'])
def index():
cur = mysql.connection.cursor()
sql_select_query_check = """UPDATE users SET Password = %s, Password_Status = %s WHERE ID = %s"""
cur.execute(sql_select_query_check, (hashcode, 1, userid[0]))
mysql.connection.commit()
return jsonify({"message": "password updated"})
main.py
from flask import Flask
from flask import render_template, request, redirect, make_response, jsonify
from flask_cors import CORS, cross_origin
import db
import views
app = Flask(__name__)
# middleware
cors = CORS(app)
myslq = db.init(app)
views.init(app, mysql)
if __name__ == '__main__':
app.run(debug=True, use_reloader=True)
但我宁愿将 views
与 app = Flask(__name__)
保留在一个文件中。
关于python - 将 Flask 代码拆分到不同的文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65473532/