Heim  >  Fragen und Antworten  >  Hauptteil

python – Daten mit flask+sqlalchemy abfragen

Werden die Daten auf der Hauptseite über ein Formular empfangen, nachdem ich mich angemeldet habe und sie auf der Hauptseite eingebunden sind? Ich weiß nicht, wie ich die gefundenen Daten auf die Seite stellen soll. Gibt es irgendwelche Informationen, die Sie empfehlen können?

怪我咯怪我咯2711 Tage vor893

Antworte allen(3)Ich werde antworten

  • 大家讲道理

    大家讲道理2017-05-18 11:01:39

    我想把从数据库查到的数据显示到页面上,我想知道是不是用form提交上去的?找不到参考资料

    我将根据这一句话来回答楼主的问题。

    我先概括一下思路:用路由把SQLAlchemy查询到的数据通过参数传递给render_template函数,再在.html文件中用jinja2实现动态渲染网页。

    比如现在你有一个博客数据库,你需要把博客的内容显示到主页上,该如何显示呢?

    主要的方法其实是用jinja2来实现,首先假设你有一个Post数据库(已经在models.py中定义好了的,别跟我说你不懂!!)

    好吧你不懂,就像这样:

    from . import db
    
    class Post(db.Model):
        __tablename__ = 'posts'
        id = db.Column(db.Integer, primary_key=True)
        body = db.Column(db.Text)
        body_html = db.Column(db.Text)
        timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
        author_id = db.Column(db.Integer, db.ForeignKey('users.id'))
        comments = db.relationship('Comment', backref='post', lazy='dynamic')
        
    db.event.listen(Post.body, 'set', Post.on_changed_body)

    什么你不懂db是哪里import来的?是app包里__init__.py来的呀!这里懒得解释了,直接帖个完整的init方法吧

    from flask import Flask
    from flask_bootstrap import Bootstrap
    from flask_mail import Mail
    from flask_moment import Moment
    from flask_sqlalchemy import SQLAlchemy
    from flask_login import LoginManager
    from flask_pagedown import PageDown
    from config import config
    
    bootstrap = Bootstrap()
    mail = Mail()
    moment = Moment()
    db = SQLAlchemy()
    pagedown = PageDown()
    
    login_manager = LoginManager()
    login_manager.session_protection = 'strong'
    login_manager.login_view = 'auth.login'
    
    
    def create_app(config_name):
        app = Flask(__name__)
        app.config.from_object(config[config_name])
        config[config_name].init_app(app)
    
        bootstrap.init_app(app)
        mail.init_app(app)
        moment.init_app(app)
        db.init_app(app)
        login_manager.init_app(app)
        pagedown.init_app(app)
    
        if not app.debug and not app.testing and not app.config['SSL_DISABLE']:
            from flask_sslify import SSLify
            sslify = SSLify(app)
    
        from .main import main as main_blueprint
        app.register_blueprint(main_blueprint)
    
        from .auth import auth as auth_blueprint
        app.register_blueprint(auth_blueprint, url_prefix='/auth')
    
        from .api_1_0 import api as api_1_0_blueprint
        app.register_blueprint(api_1_0_blueprint, url_prefix='/api/v1.0')
    
        return app
    
    

    不过更改数据库记得先运行python manager.py shell来迁移一下数据库呀(具体的自己查去)
    扯远了,我们来看楼主的问题。

    首先来看路由(就是views.py)中的内容:

    @main.route('/', methods=['GET', 'POST'])
    def index():
        #前面已经假设了你有个Post数据库
        query = Post.query
        #这里使用了pagination,就是自动实现翻页的一个扩展,可用可不用哈
        pagination = query.order_by(Post.timestamp.desc()).paginate(
            page, per_page=current_app.config['FLASKY_POSTS_PER_PAGE'],
            error_out=False)
        #这里才是重点,简单来说就是让posts=Post.query.order_by(Post.timestamp.desc())
        posts = pagination.items
        #然后用render_template传给html,交给jinja2来动态渲染
        return render_template('index.html', form=form, posts=posts,
                               show_followed=show_followed, pagination=pagination)
    

    现在让我们到index.html中来看看jinja2该如何工作,不过为了让index.html看上去尽量简洁,我将打印Post的模块单独提了出来,叫_post.html,在index.html中使用只要{% include '_posts.html' %}即可:
    让我们来看_post.html

    <ul class="posts">
        <!--处理从路由传进来的posts,用一个for循环处理,语法酷似python-->
        {% for post in posts %}
        <li class="post">
            <p class="post-thumbnail">
                <a href="{{ url_for('.user', username=post.author.username) }}">
                    <img class="img-rounded profile-thumbnail" src="{{ post.author.gravatar(size=40) }}">
                </a>
            </p>
            <p class="post-content">
            
                <!--Post数据在这里显示,你要的答案就在这了。核心思想就是用jinja2 -->
                <p class="post-date">{{ moment(post.timestamp).fromNow() }}</p>
                <p class="post-author"><a href="{{ url_for('.user', username=post.author.username) }}">{{ post.author.username }}</a></p>
                <p class="post-body">
                    {% if post.body_html %}
                        {{ post.body_html | safe }}
                    {% else %}
                        {{ post.body }}
                    {% endif %}
                </p>
            </p>
        </li>
        {% endfor %}
    </ul>
    

    以前看过一点《Flask Web开发:基于Python的Web应用开发实战》,今天小小复习一下,如果有什么不对的地方,请大家指出,谢谢!

    楼主要的答案这本书里都有,也强烈推荐想学flask的同学看看这本书呀!

    Antwort
    0
  • PHP中文网

    PHP中文网2017-05-18 11:01:39

    比如你访问的是/index页面,你肯定会有一个后端,一个前端
    给你提供思路,你自己去找相关资料,搜索引擎搜索flask开发

    @app.route('/index')
    def index():
        data = "从数据库读取出来的数据"
        html = []
        for item in data:
            html.append(item."列名")
        return ''.join(html)

    Antwort
    0
  • 为情所困

    为情所困2017-05-18 11:01:39

    你接受参数,可以用路由里面的变量,也可以用request.args.get命令获取参数。然后执行程序获得结果,当然最简单的就是拼接成字符串直接用return,当然更正式的是用render_template ,配合jinjia2渲染模板输出。

    这个还是看下flask的快速入门吧。http://docs.jinkan.org/docs/f...

    Antwort
    0
  • StornierenAntwort