python - 在 SQLAlchemy 中使用正确的文件结构以及如何将数据添加到 db

标签 python heroku flask sqlalchemy flask-sqlalchemy

我正在尝试构建一个简单的博客平台来学习 Python 和 Flask。我正在使用 SQLAlchemy 连接到托管在 Heroku 和 flask_s3 上的 Postgres 数据库,以提供来自 AWS 存储桶的静态文件。我主要是从这个开始的:

https://gist.github.com/mayukh18/2223bc8fc152631205abd7cbf1efdd41/

一切顺利,它正确托管在 Heroku 上并连接到 AWS S3 存储桶,准备就绪。然而,我被困在如何通过某种形式或路由将博客文章添加到数据库中,这将允许我填写博客文章的属性(在下面的models.py 中的 Post 中找到)

我有渲染的 html 模板和以下三个文件,app.py、manage.py 和 models.py。

应用程序.py:

from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
from flask_s3 import FlaskS3

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = '*URI for DB hosted on heroku'
app.config['FLASKS3_BUCKET_NAME'] = 'my S3 bucket on AWS'

db = SQLAlchemy(app)
s3 = FlaskS3(app)

from models import Post

#routes to templates to be rendered

if __name__ == '__main__'
    app.run(debug=True)

管理.py:
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand

from app import app, db

migrate = Migrate(app, db)

manager = Manager(app)
manager.add_command('db', MigrateCommand)

if __name__ == '__main__':
    manager.run()

和模型.py:
from manage import db,app

class Post(db.Model):
    __tablename__ = 'blogposts'

    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(120), index=True, unique=True)
    content = db.Column(db.Text, index=True, unique=True)
    date = db.Column(db.DateTime, index=True, unique=True)
    tag = db.Column(db.String(120), index=True, unique=True)
    cover = db.Column(db.String(120), index=True, unique=True)

    def __repr__(self):
        return '<Post: %r>' % (self.title)

我的文件结构是:
-blog
  --__pycache__
  --migrations
  --static
  --templates
  app.py
  manage.py
  models.py
  Pipfile
  Pipfile.lock
  Procfile

我想在本地工作(在我向 Heroku 发布任何内容之前),但不知道从这里开始做什么。在我将最终的博客文章推送到 Heroku 之前,有人对如何创建添加博客文章的路由并将它们保存到本地 Postgres 实例有任何建议吗?

我一直遵循的要点有这样的路线:
@app.route('/add/')
def webhook():
    #post attributes defined
    p = Post(id = id, title = title, date = datetime.datetime.utcnow, content = content, tag = tag, cover = cover)
    print("post created", p)
    db.session.add(p)
    db.session.commit()
    return "post created"

当我尝试在本地运行它时,我收到以下错误,所以我不确定我是否正确连接了文件。
File "/Users/Mb/Desktop/datadude/app.py", line 15, in <module>
from models import Post
ImportError: cannot import name 'Post'

对不起,如果这是错误的地方。如果有更好的地方可以征求意见,请告诉我。

最佳答案

问题存在于循环依赖中。

您可以将 SQLAlchemy 的初始化移动到 models.py。然后只在 app.py 中的 db 对象上运行方法 init_app。

模型.py

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class Post(db.Model):
    __tablename__ = 'blogposts'

    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(120), index=True, unique=True)
    content = db.Column(db.Text, index=True, unique=True)
    date = db.Column(db.DateTime, index=True, unique=True)
    tag = db.Column(db.String(120), index=True, unique=True)
    cover = db.Column(db.String(120), index=True, unique=True)

    def __repr__(self):
         return '<Post: %r>' % (self.title)

应用程序
import datetime
from flask import Flask, render_template

from flask_s3 import FlaskS3
from models import db


app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = '*URI for DB hosted on heroku'
app.config['FLASKS3_BUCKET_NAME'] = 'my S3 bucket on AWS'
db.init_app(app)

s3 = FlaskS3(app)
from models import Post


@app.route('/add/')
def webhook():
    #post attributes defined
    p = Post(id = id, title = title, date = datetime.datetime.utcnow, content = content, tag = tag, cover = cover)
    print("post created", p)
    db.session.add(p)
    db.session.commit()
    return "post created"
#routes to templates to be rendered

if __name__ == '__main__':
    app.run(debug=True)

你可以阅读更多关于它 https://github.com/slezica/bleg/blob/master/data/posts/2014-03-08-avoiding-circular-dependencies-in-flask.md

关于python - 在 SQLAlchemy 中使用正确的文件结构以及如何将数据添加到 db,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51756650/

相关文章:

python - 如何使用flask在多个页面中显示用户名?

Python:如何找到连接间隔开始和结束的最长连续间隔

python - 尝试创建列表时python crashes(?)

python - 如何使用 Python 将 GMT 时间转换为 EST 时间

ruby-on-rails - heroku 中的记录顺序不正确

在 main 中调用一次时,Python 线程运行两次

python - 使用立体图上的视差图计算实际距离

django - Heroku (Django) 上 redis_url 的字符串而不是 urlparse.ParseResult

ruby-on-rails - twitter-bootstrap-rails 不适用于heroku

python - SQLAlchemy 的正确模型定义是什么以避免错误消息 : AttributeError: 'InstrumentedList' object has no attribute'?