首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SQLAlchemy中使用适当的文件结构,以及如何将数据添加到数据库

在SQLAlchemy中使用适当的文件结构,以及如何将数据添加到数据库
EN

Stack Overflow用户
提问于 2018-08-09 06:44:00
回答 1查看 3.7K关注 0票数 5

我正在尝试建立一个简单的博客平台来学习Python和Flask。我正在使用SQLAlchemy连接到Heroku和flask_s3上托管的Postgres数据库,以提供来自AWS bucket的静态文件。我主要关注这一点:

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

一切都很顺利,它被正确地托管在Heroku上,并连接到亚马逊网络服务的S3存储桶,准备就绪。然而,我被困在如何通过某种形式或路由将博客帖子添加到数据库中,以允许我填写博客帖子的属性(在下面models.py中的帖子中找到)。

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

app.py:

代码语言:javascript
复制
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)

manage.py:

代码语言:javascript
复制
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()

和models.py:

代码语言:javascript
复制
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)

我的文件结构是:

代码语言:javascript
复制
-blog
  --__pycache__
  --migrations
  --static
  --templates
  app.py
  manage.py
  models.py
  Pipfile
  Pipfile.lock
  Procfile

我想在本地工作(在我向Heroku发布任何东西之前),但不知道从这里做什么。在我向Heroku推送最终的博客帖子之前,有谁有关于如何创建添加博客帖子的路由并将其保存到本地Postgres实例的建议?

我一直遵循的要点是这样的路线:

代码语言:javascript
复制
@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"

当我尝试在本地运行它时,我得到了以下错误,所以我不确定是否正确连接了文件。

代码语言:javascript
复制
File "/Users/Mb/Desktop/datadude/app.py", line 15, in <module>
from models import Post
ImportError: cannot import name 'Post'

抱歉,如果这里不是放这个的地方。如果有更好的地方可以寻求建议,请告诉我。

EN

回答 1

Stack Overflow用户

发布于 2018-08-09 17:00:33

这个问题存在于循环依赖中。

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

models.py

代码语言:javascript
复制
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)

app.py

代码语言:javascript
复制
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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51756650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档