用于生产和开发的烧瓶 postgresql sqlalchemy 配置

Posted

技术标签:

【中文标题】用于生产和开发的烧瓶 postgresql sqlalchemy 配置【英文标题】:flask postgresql sqlalchemy configuration for production and development 【发布时间】:2022-01-14 13:47:36 【问题描述】:

我正在尝试为烧瓶中的生产和开发环境配置我的 postgresql。现在我的配置仅适用于本地环境。我也想让它适用于生产。这就是它的样子:

app.config["SQLALCHEMY_DATABASE_URI"] = "postgresql://username:password@localhost:5432/database"

现在这个项目中完成的所有工作,包括数据库配置都包含在 app.py 文件中。我还有一个索引函数,我每 5 分钟运行一次。间隔值来自数据库。这是我的 app.py 文件.

    from flask import Flask, render_template, Response, json
    from flask_sqlalchemy import SQLAlchemy
    from bs4 import BeautifulSoup
    import requests
    from sqlalchemy import text
    import uuid
    from stockDto import StockDto
    import schedule
    import time
    
    stockDtoList = StockDto(many=True)
    
    app = Flask(__name__)
    
    db = SQLAlchemy(app)
    
    app.config["SQLALCHEMY_DATABASE_URI"] = "postgresql://username:password@localhost:5432/database"
    
    
    def generate_uuid():
        return str(uuid.uuid4())
    
            
    class StockStatus(db.Model):
        __tablename__ = 'stockstatus'
        id = db.Column(db.String, primary_key=True, default=generate_uuid)
        name = db.Column(db.Text)
        ltp = db.Column(db.Text)
        high = db.Column(db.Text)
        low = db.Column(db.Text)
    
    
    @app.route('/stockList', methods=['GET'])
    def getStock():
        try:
            articles = StockStatus.query.all()
            resultList = stockDtoList.dump(articles)
            return Response(json.dumps('status': 'success', 'message': 'data Found', 'data': resultList),
                            status=200, mimetype='application/json')
    
        except Exception as e:
            print('exception is :: ', e)
            return Response(json.dumps('status': 'failed', 'message': 'data failed  to get'),
                            status=500, mimetype='application/json')
    
    
    # @app.route('/')
    def index():
        connection = db.engine.connect(close_with_result=True)
        print('first')
    
        sql = text("""delete from stockstatus""")
        print('done')
        connection.execute(sql)
        connection.close()
        r = requests.get("http://www.dsebd.org/latest_share_price_scroll_l.php")
        # Create a BeautifulSoup object
        soup = BeautifulSoup(r.content, 'html5lib')
        soup.prettify()
        table = soup.find('table', attrs=
            'class': 'table table-bordered background-white shares-table fixedHeader')
        quotes = []  # a list to store quotes
        for row in table.find_all('tr')[1:]:
            cols = row.find_all('td')
            quotes.append('name': cols[1].text.strip().replace(",", ""),
                           'ltp': cols[2].text.strip().replace(",", ""),
                           'high': cols[3].text.strip().replace(",", ""),
                           'low': cols[4].text.strip().replace(",", ""),
                           )
    
        for SidesValue in quotes:
            dataMedia = StockStatus(
                name=SidesValue['name'],
                ltp=SidesValue['ltp'],
                high=SidesValue['high'],
                low=SidesValue['low'],
            )
    
            db.session.add(dataMedia)
            db.session.commit()
        articles = StockStatus.query.all()
    
        # return render_template("index.html", articles=articles)
    connection = db.engine.connect(close_with_result=True)
    sqlUpdate = text("""select schedulevalue from stocksettings""")
    scheduleStatus = connection.execute(sqlUpdate).fetchone()
    dataInterval = int(scheduleStatus['schedulevalue'])
    print(dataInterval)
    schedule.every(dataInterval).minutes.do(index)
    # scheduler wait for 5 mins
    while True:
        schedule.run_pending()
        time.sleep(dataInterval)
    if __name__ == "__main__":
        app.run()

我可以通过更好的文件夹结构安排以更好的方式组织这个项目。此外,在运行调度程序的项目上也应该工作。任何关于此的建议将不胜感激

【问题讨论】:

【参考方案1】:

要为烧瓶应用程序生成电离环境变量,我建议您查看https://flask.palletsprojects.com/en/2.0.x/config/#development-production

基本思想是有一个配置类,其中包含一个字典,其中键被定义为

config = "development":DevelopmentConfig, "production": ProductionConfig

此配置在应用程序的最开始处加载到__init__.py。您将使用 .env 配置根据指定的环境加载不同的配置。最后,您可以将整个应用程序 dockerize。

【讨论】:

【参考方案2】:

    首先,您可以针对不同的环境进行不同的配置。您可以在这里找到更多信息:flask production and development mode。

    你也可以考虑flask中的应用工厂模式:https://flask.palletsprojects.com/en/2.0.x/patterns/appfactories/

【讨论】:

以上是关于用于生产和开发的烧瓶 postgresql sqlalchemy 配置的主要内容,如果未能解决你的问题,请参考以下文章

更新烧瓶中的 SQL 查询不适用于浮点/小数点

在 python 烧瓶中使用空格动态更新 postgresql 表数据

按多个参数逗号值过滤烧瓶sqlalchemy postgresql

用于测试和开发配置文件的不同数据库

烧瓶从自动完成传递选定的值并执行 SQL 查询以打印结果

尝试从 SQLite 切换到 PostgreSQL