VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • 带你认识 flask 中的数据库(3)

  •  
  •  
  •  
  •  
  • >>> # get all posts written by a user>>> u = User.query.get(1)>>> u<User john>>>> posts = u.posts.all()>>> posts[<Post my first post!>]
    >>> # same, but with a user that has no posts>>> u = User.query.get(2)>>> u<User susan>>>> u.posts.all()[]
    >>> # print post author and body for all posts >>> posts = Post.query.all()>>> for p in posts:...     print(p.id, p.author.username, p.body)...1 john my first post!
    # get all users in reverse alphabetical order>>> User.query.order_by(User.username.desc()).all()[<User susan>, <User john>]

     

    Flask-SQLAlchemy文档是学习其对应操作的最好去处。

    学完本节内容,我们需要清除这些测试用户和用户动态,以便保持数据整洁和为下一章做好准备

    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    >>> users = User.query.all()>>> for u in users:...     db.session.delete(u)...>>> posts = Post.query.all()>>> for p in posts:...     db.session.delete(p)...>>> db.session.commit()

    Shell上下文

    还记得上一节的启动Python解释器之后你做过什么吗?第一件事是运行两条导入语句:

    •  
    •  
    >>> from app import db>>> from app.models import User, Post

    开发应用时,你经常会在Python shell中测试,所以每次重复上面的导入都会变得枯燥乏味。 flask shell命令是flask命令集中的另一个非常有用的工具。 shell命令是Flask在继run之后的实现第二个“核心”命令。这个命令的目的是在应用的上下文中启动一个Python解释器。这意味着什么?看下面的例子:

    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    (venv) $ python>>> appTraceback (most recent call last):  File "<stdin>", line 1, in <module>NameError: name 'app' is not defined>>>
    (venv) $ flask shell>>> app<Flask 'app'>

    使用常规的解释器会话时,除非明确地被导入,否则app对象是未知的,但是当使用flask shell时,该命令预先导入应用实例。 flask shell的绝妙之处不在于它预先导入了app,而是你可以配置一个“shell上下文”,也就是可以预先导入一份对象列表。

    microblog.py中实现一个函数,它通过添加数据库实例和模型来创建了一个shell上下文环境:

    •  
    •  
    •  
    •  
    •  
    •  
    from app import app, dbfrom app.models import User, Post
    @app.shell_context_processordef make_shell_context():    return {'db': db, 'User': User, 'Post': Post}

    app.shell_context_processor装饰器将该函数注册为一个shell上下文函数。当flask shell命令运行时,它会调用这个函数并在shell会话中注册它返回的项目。函数返回一个字典而不是一个列表,原因是对于每个项目,你必须通过字典的键提供一个名称以便在shell中被调用。

    在添加shell上下文处理器函数后,你无需导入就可以使用数据库实例:

    •  
    •  
    •  
    •  
    •  
    •  
    •  
    (venv) $ flask shell>>> db<SQLAlchemy engine=sqlite:////Users/migu7781/Documents/dev/flask/microblog2/app.db>>>> User<class 'app.models.User'>>>> Post<class 'app.models.Post'>

    如果运行以上的dbUserPost命令,报 NameError异常,说明 make_shell_context() 没有被Flask注册。最有可能的原因是你的环境变量中没有设定 FLASK_APP=microblog.py。此时你可以回到第一章复习一下如何设置FLASK_APP环境变量。如果你经常忘记在新开终端时设置该环境变量,可以如第一章末尾处那样,在项目的根目录添加一个名为 .flaskenv 的文件,并将环境变量设置在里面。

    
    相关教程