摘要:命令需要注冊回調函數來將對象添加到導入列表。創建遷移腳本在,數據庫遷移工作由遷移腳本完成。函數實施數據庫更改,是遷移的一部分,函數則刪除它們。另一方面,自動遷移通過尋找模型定義和數據庫當前狀態間的不同為和生成代碼。
9、數據庫在視圖函數中的使用
在前面章節描述的數據庫操作是可以在視圖函數中直接使用的。示例5-5展示的新版本主頁實現了用戶輸入名字并保存到數據庫中。
示例5-5. hello.py:數據庫在視圖函數中的使用
@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))
在這個已修改的應用程序版本中,每次提交一個名字應用程序都要使用filter_by()查詢過濾器到數據庫中檢查一遍。known變量被寫入到用戶會話中,這樣在重定向后信息就可以發送到模板來定制問候語。注意為了應用程序可以工作,必須創建好之前在Python shell中展示的那些數據庫表。
新版本的相關模板在示例5-6中展示。這個模板使用known參數用于區分是已知用戶還是新用戶的問候。
{% extends "base.html" %} {% import "bootstrap/wtf.html" as wtf %} {% block title %}Flasky{% endblock %} {% block page_content %}{{ wtf.quick_form(form) }} {% endblock %}Hello, {% if name %}{{ name }}{% else %}Stranger{% endif %}!
{% if not known %}Pleased to meet you!
{% else %}Happy to see you again!
{% endif %}
10、與python shell的集成建議:如果你有克隆在GitHub上的應用程序,你現在可以運行git checkout 5b來切換到這個版本的應用程序。
每次shell會話啟動都必須導入數據庫實例和模型是非常單調乏味的工作。為了避免不斷重復這些導入,可以配置Flask-Script的shell命令來自動導入特定的對象。
shell命令需要注冊make_context回調函數來將對象添加到導入列表。如示例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()函數注冊應用程序和數據庫的實例及模型,這樣就可以自動導入到shell中了:
$ python hello.py shell >>> app>>> db >>> User
11、使用Flask-Migrate遷移數據庫建議:如果你有克隆在GitHub上的應用程序,你現在可以運行git checkout 5c來切換到這個版本的應用程序。
隨著開發進度不斷向前,你會發現你的數據庫模型需要更改,而當這種情況發生時需要更新數據庫。
Flask-SQLAlchemy只有當數據庫表不存在了才從模型創建它們,所以更新表的唯一途徑就是銷毀舊的表,當然這將導致所有數據庫中的數據丟失。
有個更好的解決方案就是使用數據庫遷移框架。和源碼版本控制工具跟蹤更改源碼文件一樣,數據庫遷移框架跟蹤更改數據庫模型,然后將增量變化應用到數據庫中。
SQLAlchemy的主要開發人員寫了一個Alembic遷移框架,但我們不直接使用Alembic,Flask應用可以使用Flask-Migrate擴展,一個集成了Flask-Script來提供所有操作命令的輕量級Alembic包。
首先,Flask-Migrate必須已經安裝到虛擬環境中:
(venv) $ pip install flask-migrate
示例5-8展示擴展如何初始化。
示例5-8. hello.py:Flask-Migrate配置
from flask.ext.migrate import Migrate, MigrateCommand # ... migrate = Migrate(app, db) manager.add_command("db", MigrateCommand)
為了可以使用數據庫遷移命令,Flask-Migrate提供MigrateCommand類來連接Flask-Script的manager對象。在這個示例中使用db來連接到命令。
在數據庫遷移可以維護之前,必須通過init子命令來創建一個遷移庫:
(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.
這個命令創建一個migrations文件夾,里面存放了所有遷移腳本。
建議:如果你有克隆在GitHub上的應用程序,你現在可以運行git checkout 5c來切換到這個版本的應用程序。
在Alembic,數據庫遷移工作由遷移腳本完成。這個腳本有兩個函數,分別叫做upgrade()和downgrade()。upgrade()函數實施數據庫更改,是遷移的一部分,downgrade()函數則刪除它們。通過添加和刪除數據庫變化的能力,Alembic可以重新配置數據庫從歷史記錄中的任何時間點。
Alembic遷移可以分別使用revision和migrate命令手動或自動創建。手動遷移通過由開發人員使用Alembic的Operations對象指令實現的空upgrade()和downgrade()函數創建遷移框架腳本。另一方面,自動遷移通過尋找模型定義和數據庫當前狀態間的不同為upgrade()和downgrade()生成代碼。
警告:自動遷移并不總是準確的,可以忽略一些細節。所以應該經常審查一下自動生成的遷移腳本。
migrate子命令創建自動遷移腳本:
(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上的應用程序,你現在可以運行git checkout 5c來切換到這個版本的應用程序。注意,你不需要為這個應用生成migrations,所有的遷移腳本都包含在版本庫中。
一旦遷移腳本被審查且接受,就可以使用db upgrade命令更新到數據庫中:
(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
第一次遷移實際上相當于調用db.create_all(),但在后續遷移中,upgrade命令對表實施更新操作但不影響表中的內容。
數據庫的設計和使用是非常重要的,事實上整本書都是圍繞這個主題來寫的。你應該把本章作為一個概述來研究;更高級的主題將在以后的章節中討論。下一章致力于講解發送電子郵件。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37465.html
摘要:每個表單域都可以連接到一個或多個是一個用于檢查用戶提交的輸入是否合法的函數。表單域構造函數的第一個參數是一個,在渲染表單到時會使用。驗證確保提交的表單域不為空。表單域驗證都是直接從包中導入。表格展示了一組支持的標準表單域。 第二章中介紹的request對象公開了所有客戶端發送的請求信息。特別是request.form可以訪問POST請求提交的表單數據。 盡管Flask的request...
摘要:有兩類應用級和請求級。一個響應中非常重要的部分是狀態碼,默認設置來指示請求已經成功處理。重定向通常由響應狀態碼注明并且重定向的由頭部的給出。因為這些變化,應用程序獲得一組基本的命令行選項。運行顯示可用信息在應用程序上下文的內部運行一個。 5、請求-響應循環 現在你已經玩過一個基本的Flask應用程序,你也許想要知道更多關于Flask如何施展魔力。下面章節描述了一些框架設計方面的特點。...
摘要:單元測試這個應用非常小以至于不需要太多的測試,但是作為示例會在示例中展示兩個簡單的測試定義。示例單元測試編寫好的測試使用的是來自于標準庫中標準的包。為了運行單元測試,可以在腳本中增加一個自定義的命令。 4、啟動腳本 頂層目錄中的manage.py文件用于啟動應用。這個腳本會在示例7-8中展示。 示例7-8. manage.py:啟動腳本 #!/usr/bin/env python im...
摘要:注對于開發者來說,傳給應用程序構造函數的參數是比較容易弄混淆的。在應程序中定義路由的最便捷的方式是通過顯示定義在應用程序實例之上的裝飾器,注冊被裝飾的函數來作為一個路由。一個常見的模式是使用裝飾器來注冊函數作為一個事件處理程序。 在這一章,你將學習Flask應用程序不同部分。同時你將編寫和運行你的第一個Flask web應用程序。 1、初始化 在這章,你將學到Flask應用程序的不...
閱讀 1906·2021-11-22 14:44
閱讀 1672·2021-11-02 14:46
閱讀 3657·2021-10-13 09:40
閱讀 2600·2021-09-07 09:58
閱讀 1586·2021-09-03 10:28
閱讀 1658·2019-08-29 15:30
閱讀 976·2019-08-29 15:28
閱讀 1469·2019-08-26 12:20