成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Flask Web Development —— 數(shù)據(jù)庫(下)

jone5679 / 679人閱讀

摘要:命令需要注冊回調(diào)函數(shù)來將對象添加到導(dǎo)入列表。創(chuàng)建遷移腳本在,數(shù)據(jù)庫遷移工作由遷移腳本完成。函數(shù)實施數(shù)據(jù)庫更改,是遷移的一部分,函數(shù)則刪除它們。另一方面,自動遷移通過尋找模型定義和數(shù)據(jù)庫當(dāng)前狀態(tài)間的不同為和生成代碼。

9、數(shù)據(jù)庫在視圖函數(shù)中的使用

在前面章節(jié)描述的數(shù)據(jù)庫操作是可以在視圖函數(shù)中直接使用的。示例5-5展示的新版本主頁實現(xiàn)了用戶輸入名字并保存到數(shù)據(jù)庫中。

示例5-5. hello.py:數(shù)據(jù)庫在視圖函數(shù)中的使用

@app.route("/", methods=["GET", "POST"]) 
def index():
    form = NameForm()
    if form.validate_on_submit():
        user = User.query.filter_by(username=form.name.data).first() 
        if user is None:
            user = User(username = form.name.data)
            db.session.add(user)
            session["known"] = False
        else:
            session["known"] = True
        session["name"] = form.name.data 
        form.name.data = ""
        return redirect(url_for("index"))
    return render_template("index.html",
        form = form, name = session.get("name"), known = session.get("known", False))

在這個已修改的應(yīng)用程序版本中,每次提交一個名字應(yīng)用程序都要使用filter_by()查詢過濾器到數(shù)據(jù)庫中檢查一遍。known變量被寫入到用戶會話中,這樣在重定向后信息就可以發(fā)送到模板來定制問候語。注意為了應(yīng)用程序可以工作,必須創(chuàng)建好之前在Python shell中展示的那些數(shù)據(jù)庫表。

新版本的相關(guān)模板在示例5-6中展示。這個模板使用known參數(shù)用于區(qū)分是已知用戶還是新用戶的問候。

{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}

{% block title %}Flasky{% endblock %}

{% block page_content %}





{{ wtf.quick_form(form) }}
{% endblock %}
  

建議:如果你有克隆在GitHub上的應(yīng)用程序,你現(xiàn)在可以運行git checkout 5b來切換到這個版本的應(yīng)用程序。

10、與python shell的集成

每次shell會話啟動都必須導(dǎo)入數(shù)據(jù)庫實例和模型是非常單調(diào)乏味的工作。為了避免不斷重復(fù)這些導(dǎo)入,可以配置Flask-Script的shell命令來自動導(dǎo)入特定的對象。

shell命令需要注冊make_context回調(diào)函數(shù)來將對象添加到導(dǎo)入列表。如示例5-7所示。

示例5-7. hello.py:增加shell上下文

from flask.ext.script import Shell 

def make_shell_context():
    return dict(app=app, db=db, User=User, Role=Role)
manager.add_command("shell", Shell(make_context=make_shell_context))

make_shell_context()函數(shù)注冊應(yīng)用程序和數(shù)據(jù)庫的實例及模型,這樣就可以自動導(dǎo)入到shell中了:

$ python hello.py shell
>>> app

>>> db
 
>>> User

  

建議:如果你有克隆在GitHub上的應(yīng)用程序,你現(xiàn)在可以運行git checkout 5c來切換到這個版本的應(yīng)用程序。

11、使用Flask-Migrate遷移數(shù)據(jù)庫

隨著開發(fā)進(jìn)度不斷向前,你會發(fā)現(xiàn)你的數(shù)據(jù)庫模型需要更改,而當(dāng)這種情況發(fā)生時需要更新數(shù)據(jù)庫。

Flask-SQLAlchemy只有當(dāng)數(shù)據(jù)庫表不存在了才從模型創(chuàng)建它們,所以更新表的唯一途徑就是銷毀舊的表,當(dāng)然這將導(dǎo)致所有數(shù)據(jù)庫中的數(shù)據(jù)丟失。

有個更好的解決方案就是使用數(shù)據(jù)庫遷移框架。和源碼版本控制工具跟蹤更改源碼文件一樣,數(shù)據(jù)庫遷移框架跟蹤更改數(shù)據(jù)庫模型,然后將增量變化應(yīng)用到數(shù)據(jù)庫中。

SQLAlchemy的主要開發(fā)人員寫了一個Alembic遷移框架,但我們不直接使用Alembic,F(xiàn)lask應(yīng)用可以使用Flask-Migrate擴(kuò)展,一個集成了Flask-Script來提供所有操作命令的輕量級Alembic包。

11.1、創(chuàng)建遷移倉庫

首先,F(xiàn)lask-Migrate必須已經(jīng)安裝到虛擬環(huán)境中:

(venv) $ pip install flask-migrate

示例5-8展示擴(kuò)展如何初始化。

示例5-8. hello.py:Flask-Migrate配置

from flask.ext.migrate import Migrate, MigrateCommand 

# ...

migrate = Migrate(app, db)
manager.add_command("db", MigrateCommand)

為了可以使用數(shù)據(jù)庫遷移命令,F(xiàn)lask-Migrate提供MigrateCommand類來連接Flask-Script的manager對象。在這個示例中使用db來連接到命令。

在數(shù)據(jù)庫遷移可以維護(hù)之前,必須通過init子命令來創(chuàng)建一個遷移庫:

(venv) $ python hello.py db init
  Creating directory /home/flask/flasky/migrations...done
  Creating directory /home/flask/flasky/migrations/versions...done
  Generating /home/flask/flasky/migrations/alembic.ini...done
  Generating /home/flask/flasky/migrations/env.py...done
  Generating /home/flask/flasky/migrations/env.pyc...done
  Generating /home/flask/flasky/migrations/README...done
  Generating /home/flask/flasky/migrations/script.py.mako...done
  Please edit configuration/connection/logging settings in
  "/home/flask/flasky/migrations/alembic.ini" before proceeding.

這個命令創(chuàng)建一個migrations文件夾,里面存放了所有遷移腳本。

  

建議:如果你有克隆在GitHub上的應(yīng)用程序,你現(xiàn)在可以運行git checkout 5c來切換到這個版本的應(yīng)用程序。

11.2、創(chuàng)建遷移腳本

在Alembic,數(shù)據(jù)庫遷移工作由遷移腳本完成。這個腳本有兩個函數(shù),分別叫做upgrade()downgrade()。upgrade()函數(shù)實施數(shù)據(jù)庫更改,是遷移的一部分,downgrade()函數(shù)則刪除它們。通過添加和刪除數(shù)據(jù)庫變化的能力,Alembic可以重新配置數(shù)據(jù)庫從歷史記錄中的任何時間點。

Alembic遷移可以分別使用revisionmigrate命令手動或自動創(chuàng)建。手動遷移通過由開發(fā)人員使用Alembic的Operations對象指令實現(xiàn)的空upgrade()downgrade()函數(shù)創(chuàng)建遷移框架腳本。另一方面,自動遷移通過尋找模型定義和數(shù)據(jù)庫當(dāng)前狀態(tài)間的不同為upgrade()downgrade()生成代碼。

  

警告:自動遷移并不總是準(zhǔn)確的,可以忽略一些細(xì)節(jié)。所以應(yīng)該經(jīng)常審查一下自動生成的遷移腳本。

migrate子命令創(chuàng)建自動遷移腳本:

(venv) $ python hello.py db migrate -m "initial migration"
INFO  [alembic.migration] Context impl SQLiteImpl.
INFO  [alembic.migration] Will assume non-transactional DDL.
INFO  [alembic.autogenerate] Detected added table "roles"
INFO  [alembic.autogenerate] Detected added table "users"
INFO  [alembic.autogenerate.compare] Detected added index
"ix_users_username" on "["username"]"
  Generating /home/flask/flasky/migrations/versions/1bc
  594146bb5_initial_migration.py...done
  

建議:如果你有克隆在GitHub上的應(yīng)用程序,你現(xiàn)在可以運行git checkout 5c來切換到這個版本的應(yīng)用程序。注意,你不需要為這個應(yīng)用生成migrations,所有的遷移腳本都包含在版本庫中。

11.3、更新數(shù)據(jù)庫

一旦遷移腳本被審查且接受,就可以使用db upgrade命令更新到數(shù)據(jù)庫中:

(venv) $ python hello.py db upgrade
INFO  [alembic.migration] Context impl SQLiteImpl.
INFO  [alembic.migration] Will assume non-transactional DDL.
INFO  [alembic.migration] Running upgrade None -> 1bc594146bb5, initial migration

第一次遷移實際上相當(dāng)于調(diào)用db.create_all(),但在后續(xù)遷移中,upgrade命令對表實施更新操作但不影響表中的內(nèi)容。

數(shù)據(jù)庫的設(shè)計和使用是非常重要的,事實上整本書都是圍繞這個主題來寫的。你應(yīng)該把本章作為一個概述來研究;更高級的主題將在以后的章節(jié)中討論。下一章致力于講解發(fā)送電子郵件。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/37465.html

相關(guān)文章

  • Flask Web Development —— Web表單(上)

    摘要:每個表單域都可以連接到一個或多個是一個用于檢查用戶提交的輸入是否合法的函數(shù)。表單域構(gòu)造函數(shù)的第一個參數(shù)是一個,在渲染表單到時會使用。驗證確保提交的表單域不為空。表單域驗證都是直接從包中導(dǎo)入。表格展示了一組支持的標(biāo)準(zhǔn)表單域。 第二章中介紹的request對象公開了所有客戶端發(fā)送的請求信息。特別是request.form可以訪問POST請求提交的表單數(shù)據(jù)。 盡管Flask的request...

    CODING 評論0 收藏0
  • Flask Web Development —— 基本應(yīng)用程序結(jié)構(gòu)(

    摘要:有兩類應(yīng)用級和請求級。一個響應(yīng)中非常重要的部分是狀態(tài)碼,默認(rèn)設(shè)置來指示請求已經(jīng)成功處理。重定向通常由響應(yīng)狀態(tài)碼注明并且重定向的由頭部的給出。因為這些變化,應(yīng)用程序獲得一組基本的命令行選項。運行顯示可用信息在應(yīng)用程序上下文的內(nèi)部運行一個。 5、請求-響應(yīng)循環(huán) 現(xiàn)在你已經(jīng)玩過一個基本的Flask應(yīng)用程序,你也許想要知道更多關(guān)于Flask如何施展魔力。下面章節(jié)描述了一些框架設(shè)計方面的特點。...

    caohaoyu 評論0 收藏0
  • Flask Web Development —— 大型應(yīng)用程序結(jié)構(gòu)(

    摘要:單元測試這個應(yīng)用非常小以至于不需要太多的測試,但是作為示例會在示例中展示兩個簡單的測試定義。示例單元測試編寫好的測試使用的是來自于標(biāo)準(zhǔn)庫中標(biāo)準(zhǔn)的包。為了運行單元測試,可以在腳本中增加一個自定義的命令。 4、啟動腳本 頂層目錄中的manage.py文件用于啟動應(yīng)用。這個腳本會在示例7-8中展示。 示例7-8. manage.py:啟動腳本 #!/usr/bin/env python im...

    whidy 評論0 收藏0
  • Flask Web Development —— 基本應(yīng)用程序結(jié)構(gòu)(上)

    摘要:注對于開發(fā)者來說,傳給應(yīng)用程序構(gòu)造函數(shù)的參數(shù)是比較容易弄混淆的。在應(yīng)程序中定義路由的最便捷的方式是通過顯示定義在應(yīng)用程序?qū)嵗系难b飾器,注冊被裝飾的函數(shù)來作為一個路由。一個常見的模式是使用裝飾器來注冊函數(shù)作為一個事件處理程序。 在這一章,你將學(xué)習(xí)Flask應(yīng)用程序不同部分。同時你將編寫和運行你的第一個Flask web應(yīng)用程序。 1、初始化 在這章,你將學(xué)到Flask應(yīng)用程序的不...

    NusterCache 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<