【问题标题】:Splitting Flask code into different files [closed]将 Flask 代码拆分为不同的文件 [关闭]
【发布时间】:2020-12-28 05:56:46
【问题描述】:

下面是python烧瓶代码。

我要做的就是将代码拆分为不同的文件,如下所示 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)

【问题讨论】:

  • 你尝试了什么?你收到错误信息了吗?始终将完整的 errormessag(从“Traceback”一词开始)作为 tex(不是屏幕截图)有问题(不是评论)。还有其他有用的信息。
  • 没有错误,什么也没有。我只想将此代码拆分为多个文件,就像在单独的路由文件、数据库和主文件中一样。 @furas
  • 你试过分裂吗?首先尝试,问问题什么时候会出错。
  • 这里有什么问题?

标签: python mysql python-3.x flask routes


【解决方案1】:

flask 文档中,您可以看到Larger Applications,它显示了如何拆分代码。它提到主要问题可能是循环导入 - main 导入 views 必须导入 main 才能获得 appdb.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"})

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__) 保留在一个文件中。

【讨论】:

  • 感谢您的回答。我做了同样的事情,将视图和应用程序保存在同一个文件中,但我被告知要拆分代码
猜你喜欢
  • 1970-01-01
  • 2021-07-26
  • 2021-02-14
  • 2021-03-25
  • 2020-01-30
  • 2021-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多