国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

fasss / 2695人閱讀

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

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

在前面章節(jié)描述的數(shù)據(jù)庫操作是可以在視圖函數(shù)中直接使用的。示例5-5展示的新版本主頁實(shí)現(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))

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

新版本的相關(guān)模板在示例5-6中展示。這個(gè)模板使用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)在可以運(yùn)行git checkout 5b來切換到這個(gè)版本的應(yīng)用程序。

10、與python shell的集成

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

shell命令需要注冊(cè)make_context回調(diào)函數(shù)來將對(duì)象添加到導(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ù)注冊(cè)應(yīng)用程序和數(shù)據(jù)庫的實(shí)例及模型,這樣就可以自動(dòng)導(dǎo)入到shell中了:

$ python hello.py shell
>>> app

>>> db
 
>>> User

  

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

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

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

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

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

SQLAlchemy的主要開發(fā)人員寫了一個(gè)Alembic遷移框架,但我們不直接使用Alembic,F(xiàn)lask應(yīng)用可以使用Flask-Migrate擴(kuò)展,一個(gè)集成了Flask-Script來提供所有操作命令的輕量級(jí)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對(duì)象。在這個(gè)示例中使用db來連接到命令。

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

(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.

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

  

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

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

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

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

  

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

migrate子命令創(chuàng)建自動(dò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)在可以運(yùn)行git checkout 5c來切換到這個(gè)版本的應(yīng)用程序。注意,你不需要為這個(gè)應(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

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

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/17443.html

相關(guān)文章

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

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

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

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

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

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

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

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

    NusterCache 評(píng)論0 收藏0
  • Flask Web Development —— 數(shù)據(jù)庫

    摘要:命令需要注冊(cè)回調(diào)函數(shù)來將對(duì)象添加到導(dǎo)入列表。創(chuàng)建遷移腳本在,數(shù)據(jù)庫遷移工作由遷移腳本完成。函數(shù)實(shí)施數(shù)據(jù)庫更改,是遷移的一部分,函數(shù)則刪除它們。另一方面,自動(dòng)遷移通過尋找模型定義和數(shù)據(jù)庫當(dāng)前狀態(tài)間的不同為和生成代碼。 9、數(shù)據(jù)庫在視圖函數(shù)中的使用 在前面章節(jié)描述的數(shù)據(jù)庫操作是可以在視圖函數(shù)中直接使用的。示例5-5展示的新版本主頁實(shí)現(xiàn)了用戶輸入名字并保存到數(shù)據(jù)庫中。 示例5-5. he...

    jone5679 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<