python - 将 Flask 代码拆分到不同的文件中

标签 python mysql python-3.x flask routes

下面是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 以跳过循环导入

enter image description here

我不运行代码,也许需要将 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"})

ma​​in.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"})

ma​​in.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)

但我宁愿将 viewsapp = Flask(__name__) 保留在一个文件中。

关于python - 将 Flask 代码拆分到不同的文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65473532/

相关文章:

python - 为什么当我增加字体大小/更改字体类型时按钮大小会增加?

python - Django 注册 redux 仅使用电子邮件注册(无密码)

python - 循环之神再次来袭——如何在 GUI mainloop 的情况下保持套接字连接?

Python - 计算来自 txt 文件的标签的行之间的时间差

python - Pandas:如何从 CSV 读取字节和非字节列并解码字节列?

python - 第一次只移动 zip Python 中两个迭代器中的一个

mysql - 在 mysql 中存储和检索用户收藏夹

mysql - 如何合并两个表中的数据

php - 通过php向mysql数据库插入大量数据时出现服务器错误500

python-3.x - Cloud Natural Language API 返回 socket.gaierror : nodename nor servname provided after performing Sentiment Analysis every now and then