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

資訊專欄INFORMATION COLUMN

Flask Web Development —— 大型應(yīng)用程序結(jié)構(gòu)(下)

whidy / 2508人閱讀

摘要:單元測試這個應(yīng)用非常小以至于不需要太多的測試,但是作為示例會在示例中展示兩個簡單的測試定義。示例單元測試編寫好的測試使用的是來自于標(biāo)準(zhǔn)庫中標(biāo)準(zhǔn)的包。為了運(yùn)行單元測試,可以在腳本中增加一個自定義的命令。

4、啟動腳本

頂層目錄中的manage.py文件用于啟動應(yīng)用。這個腳本會在示例7-8中展示。

示例7-8. manage.py:啟動腳本

#!/usr/bin/env python
import os
from app import create_app, db
from app.models import User, Role
from flask.ext.script import Manager, Shell
from flask.ext.migrate import Migrate, MigrateCommand

app = create_app(os.getenv("FLASK_CONFIG") or "default") 
manager = Manager(app)
migrate = Migrate(app, db)

def make_shell_context():
    return dict(app=app, db=db, User=User, Role=Role)

manager.add_command("shell", Shell(make_context=make_shell_context))
manager.add_command("db", MigrateCommand)

if __name__ == "__main__": 
    manager.run()

這個腳本開始于創(chuàng)建應(yīng)用程序。使用環(huán)境變量FLASK_CONFIG,若它已經(jīng)定義了則從中獲取配置;如果沒有,則是用默認(rèn)配置。然后用于Python shell的Flask-Script、Flask-Migrate以及自定義上下文會被初始化。

為了方便,會增加一行執(zhí)行環(huán)境,這樣在基于Unix的操作系統(tǒng)上可以通過./manage.py來執(zhí)行腳本來替代冗長的python manage.py。

5、需求文件

應(yīng)用程序必須包含requirements.txt文件來記錄所有依賴包,包括精確的版本號。這很重要,因?yàn)榭梢栽诓煌臋C(jī)器上重新生成虛擬環(huán)境,例如在生產(chǎn)環(huán)境的機(jī)器上部署應(yīng)用程序。這個文件可以通過下面的pip命令自動生成:

(venv) $ pip freeze >requirements.txt

當(dāng)安裝或更新一個包之后最好再更新一下這個文件。以下展示了一個需求文件示例:

Flask==0.10.1
Flask-Bootstrap==3.0.3.1
Flask-Mail==0.9.0
Flask-Migrate==1.1.0
Flask-Moment==0.2.0
Flask-SQLAlchemy==1.0
Flask-Script==0.6.6
Flask-WTF==0.9.4
Jinja2==2.7.1
Mako==0.9.1
MarkupSafe==0.18
SQLAlchemy==0.8.4
WTForms==1.0.5
Werkzeug==0.9.4
alembic==0.6.2
blinker==1.3
itsdangerous==0.23

當(dāng)你需要完美復(fù)制一個虛擬環(huán)境的時候,你可以運(yùn)行以下命令創(chuàng)建一個新的虛擬環(huán)境:

(venv) $ pip install -r requirements.txt

當(dāng)你讀到這時,示例requirements.txt文件中的版本號可能已經(jīng)過時了。如果喜歡你可以嘗試用最近發(fā)布的包。如果遇到任何問題,你可以隨時回退到需求文件中與應(yīng)用兼容的指定版本。

6、單元測試

這個應(yīng)用非常小以至于不需要太多的測試,但是作為示例會在示例7-9中展示兩個簡單的測試定義。

示例7-9. tests/test_basics.py:單元測試

import unittest
from flask import current_app 
from app import create_app, db

class BasicsTestCase(unittest.TestCase): 
    def setUp(self):
        self.app = create_app("testing")
        self.app_context = self.app.app_context()
        self.app_context.push()
        db.create_all()

    def tearDown(self): 
        db.session.remove() 
        db.drop_all() 
        self.app_context.pop()

    def test_app_exists(self): 
        self.assertFalse(current_app is None)

    def test_app_is_testing(self): 
        self.assertTrue(current_app.config["TESTING"])

編寫好的測試使用的是來自于Python標(biāo)準(zhǔn)庫中標(biāo)準(zhǔn)的unittest包。setUp()tearDown()方法在每個測試之前和之后運(yùn)行,且任何一個方法必須以test_開頭作為測試來執(zhí)行。

建議:如果你想要學(xué)習(xí)更多使用Python的unittest包來寫單元測試的內(nèi)容,請參閱官方文檔。

setUp()方法嘗試創(chuàng)建一個測試環(huán)境,類似于運(yùn)行應(yīng)用程序。首先它創(chuàng)建應(yīng)用程序配置用于測試并激活上下文。這一步確保測試可以和常規(guī)請求一樣訪問current_app。然后,當(dāng)需要的時候,可以創(chuàng)建一個供測試使用的全新數(shù)據(jù)庫。數(shù)據(jù)庫和應(yīng)用程序上下文會在tearDown()方法中被移除。

第一個測試確保應(yīng)用程序?qū)嵗嬖?。第二個測試確保應(yīng)用程序在測試配置下運(yùn)行。為了確保tests目錄有效,需要在tests目錄下增加__init__.py文件,不過該文件可以為空,這樣unittest包可以掃描所有模塊并定位測試。

建議:如果你有克隆在GitHub上的應(yīng)用程序,你現(xiàn)在可以運(yùn)行git checkout 7a來切換到這個版本的應(yīng)用程序。為了確保你已經(jīng)安裝了所有依賴集,需要運(yùn)行pip install -r requirements.txt。

為了運(yùn)行單元測試,可以在manage.py腳本中增加一個自定義的命令。

示例7-10展示如何添加測試命令。

示例7-10. manage.pyt:單元測試啟動腳本

@manager.command
def test():
    """Run the unit tests."""
    import unittest
    tests = unittest.TestLoader().discover("tests") 
    unittest.TextTestRunner(verbosity=2).run(tests)

manager.command裝飾器使得它可以很容易的實(shí)現(xiàn)自定義命令。被裝飾的函數(shù)名可以被當(dāng)做命令名使用,且函數(shù)的文檔字符串會顯示幫助信息。test()函數(shù)的執(zhí)行會調(diào)用unittest包中的測試運(yùn)行器。

單元測試可以像下面這樣執(zhí)行:

(venv) $ python manage.py test
test_app_exists (test_basics.BasicsTestCase) ... ok
test_app_is_testing (test_basics.BasicsTestCase) ... ok

.----------------------------------------------------------------------
Ran 2 tests in 0.001s

OK
7、數(shù)據(jù)庫啟動

與單腳本的應(yīng)用相比,重構(gòu)后的應(yīng)用使用不同數(shù)據(jù)庫。

從環(huán)境變量中獲取的數(shù)據(jù)庫URL作為首選,默認(rèn)SQLite數(shù)據(jù)庫作為可選。三個配置中的環(huán)境變量和SQLite數(shù)據(jù)庫文件名是不一樣的。例如,開發(fā)配置的URL是從DEV_DATABASE_URL環(huán)境變量中獲取,如果沒有定義則會使用名為data-dev.sqlite的SQLite數(shù)據(jù)庫。

無論數(shù)據(jù)庫URL源的是哪一個,都必須為新的數(shù)據(jù)庫創(chuàng)建數(shù)據(jù)庫表。如果使用了Flask-Migrate來保持遷移跟蹤,數(shù)據(jù)庫表可以被創(chuàng)建或更新到最近的版本通過下面的命令:

(venv) $ python manage.py db upgrade

相信與否,已經(jīng)到了第一部分結(jié)束的地方。你現(xiàn)在已經(jīng)學(xué)到了Flask必要的基本要素,但是你不確定如何將這些零散的知識組合在一起形成一個真正的應(yīng)用程序。第二部分的目的是通過開發(fā)一個完整的應(yīng)用程序來帶領(lǐng)你繼續(xù)前行。

注:前段時間才知道這本書已經(jīng)由圖靈社區(qū)出版翻譯,已經(jīng)開始預(yù)售了,并于12月19日到貨。喜歡的朋友也可以[點(diǎn)我]購買一本。后面的章節(jié)就不再繼續(xù)更新了,自己肯定也會去支持這本書的。

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

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

相關(guān)文章

  • Flask Web Development —— 大型應(yīng)用程序結(jié)構(gòu)(上)

    摘要:被定義在包的構(gòu)造函數(shù)中的應(yīng)用程序工廠函數(shù)會在示例中展示。這個構(gòu)造函數(shù)導(dǎo)入大部分當(dāng)前需要使用的擴(kuò)展,但因?yàn)闆]有應(yīng)用程序?qū)嵗跏蓟鼈儯梢员粍?chuàng)建但不初始化通過不傳遞參數(shù)給它們的構(gòu)造函數(shù)。而應(yīng)用程序范圍內(nèi)的錯誤處理則必須使用。 雖然小型web應(yīng)用程序用單個腳本可以很方便,但這種方法卻不能很好地擴(kuò)展。隨著應(yīng)用變得復(fù)雜,在單個大的源文件中處理會變得問題重重。 與大多數(shù)其他web框架不同,F(xiàn)l...

    chemzqm 評論0 收藏0
  • [分享] Flask 網(wǎng)絡(luò)開發(fā)經(jīng)典書籍: Flask Web Development

    摘要:他和妻子四個孩子兩只狗和一只貓共同生活在俄勒岡州波特蘭市。。還邀請他根據(jù)書的內(nèi)容,制作了兩個視頻教程。 showImg(http://img4.douban.com/lpic/s27205547.jpg); 這本書算是學(xué)習(xí)Flask的權(quán)威材料了,網(wǎng)上很多人都是推薦從這本書開始學(xué)習(xí)。起初,作者在自己的博客發(fā)布了一個大型的Flask建站教程,在這個教程大受歡迎的基礎(chǔ)上,才與OReilly公...

    HmyBmny 評論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)用程序不同部分。同時你將編寫和運(yùn)行你的第一個Flask web應(yīng)用程序。 1、初始化 在這章,你將學(xué)到Flask應(yīng)用程序的不...

    NusterCache 評論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àn)檫@些變化,應(yīng)用程序獲得一組基本的命令行選項(xiàng)。運(yùn)行顯示可用信息在應(yīng)用程序上下文的內(nèi)部運(yùn)行一個。 5、請求-響應(yīng)循環(huán) 現(xiàn)在你已經(jīng)玩過一個基本的Flask應(yīng)用程序,你也許想要知道更多關(guān)于Flask如何施展魔力。下面章節(jié)描述了一些框架設(shè)計方面的特點(diǎn)。...

    caohaoyu 評論0 收藏0
  • Flask Web Development —— 模板(上)

    摘要:用真實(shí)的值替換變量并返回最終響應(yīng)字符串,這個過程稱為渲染。示例展示模板實(shí)現(xiàn)該響應(yīng)??刂平Y(jié)構(gòu)提供一些控制結(jié)構(gòu)用于改變模板流。這個示例展示如何使用循環(huán)做到這些同樣支持宏,這和代碼中的函數(shù)很像。 寫代碼最關(guān)鍵的是要易于維護(hù)且結(jié)構(gòu)清晰整潔。目前為止,你看到的例子都過于簡單從而沒有做這方面的要求。Flask視圖函數(shù)希望將兩個應(yīng)該完全獨(dú)立的任務(wù)一并處理,兩個任務(wù)有兩種代碼,一并處理勢必會引發(fā)問題。...

    fizz 評論0 收藏0

發(fā)表評論

0條評論

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