Flask_Web學習梳理總結(上)

寫在開頭:
總結部分爲《Flask Web開發》的chapter 1到chapter 10的內容,主要爲了理清代碼框架的內容,具體到一些具體實現細節不會展開講,能夠看書或網上查找相關資料。爲了和書上的代碼徹底一致,示例用的是原做者最初期的代碼版本,地址放在下面。
https://github.com/miguelgrin...html

先來認識下面一個最簡單的FLASK完整程序,命名爲hello.py後運行,而後打開地址欄在地址欄輸入http://127.0.0.1:5000/便可在網頁上看到一個雖小但完整的Flask程序。python

from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return '<h1>Hello World!</h1>'

if __name__ == '__main__':
    app.run(debug=True)

這個程序主要包括兩個必要的部分:程序實例app 和 路由視圖函數@app.route。簡單的hello.py程序可能只須要這兩個部分,可是當開發的項目較大時,就須要加入更多的東西作支撐,例如加入數據庫,藍圖,和一些第三方庫讓咱們的開發更容易實現,這時候就須要包裝和豐富程序示例app和路由視圖函數@app.route這兩個元素。git

先看check out 10d 分支獲得的代碼目錄
clipboard.pnggithub

在這份代碼目錄中,只須要運行manage.py --runserver能夠獲得chapter 10以前的完整網頁內容。從manage.py的代碼開始,create_app爲工廠函數,這個函數能夠靈活的獲得不一樣配置的程序實例app,輸入的惟一參數是程序使用的配置名(這裏的os.getenv意思是從環境變量中獲取),配置名在config.py中用字典的方式儲存,create_app(config_name)函數經過config_name來選擇採用哪些配置並和和app作鏈接,並經過.init_app來傳入配置參數 ,函數最後返回一個程序示例app。web

manager = Manager(app)這裏的Manager類是由Flask-Scripts擴展輸出的,Flask-Scripts是爲Flask程序添加了命令行解析器的擴展,經過這個擴展,服務器由 manager.run() 啓動後就能解析命令行了。sql

migrate = Migrate(app, db)這裏使用Flask-Migrate實現數據庫遷移,若是不進行數據庫遷移,那麼更新數據庫就須要每次先刪除舊錶,再建立一個新表。而數據庫遷移技術能增量式地把變化應用到數據庫中。這句代碼意思註冊migrate到實例app上,獲得的遷移腳本都會放在migration文件夾裏。shell

make_shell_context() 函數註冊了程序、數據庫實例以及模型,所以這些對象能直接導入shell.
manager.add_command() 函數在終端環境下添加一個shell命令和db命令.
def test():自定義一個啓動單元測試的命令數據庫

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

def make_shell_context():
   ...
manager.add_command("shell", Shell(make_context=make_shell_context))
manager.add_command('db', MigrateCommand)
@manager.command
def test():
...

這裏大體就完成了建立程序實例app的部分flask

下面要完成各個部分網頁的路由視圖部分,這是程序項目的主要部分,工程文件放在app文件夾內。此文件夾包含四個子文件夾和init.py、decorators.py、email.py、model.py四個獨立python文件。auth和main文件夾是區分功能的兩個藍本內容,static是一些靜態文件,templates是網頁模板。segmentfault

clipboard.png

從app/init.py代碼段開始,定義了一個工廠函數created_app(),並將藍本main和藍本auth在工廠函數 create_app() 中註冊到程序上,最後返回程序實例。

def create_app()
   ...  
   from .main import main as main_blueprint
   app.register_blueprint(main_blueprint)

   from .auth import auth as auth_blueprint
   app.register_blueprint(auth_blueprint, url_prefix='/auth')

   return app

這是因爲原始的app.route 修飾器只能在調用 create_app() 以後才能使用,這時候這時定義路由就太晚了。一樣,自定義的錯誤頁面處理程序也面臨相同的困難,由於錯誤頁面處理程序使用 app.errorhandler 修飾器定義。爲了解決這個問題,就採用了藍本的方式。藍本中定義的路由處於休眠狀態,直到藍本註冊到程序上後,路由才真正成爲程序的一部分。

對於不一樣的程序功能,咱們要使用不一樣的藍本,這是保持代碼整齊有序的好方法。這裏的代碼目錄有兩個主要藍本:通常的路由在main藍本中定義,與用戶認證系統相關的路由可在 auth 藍本中定義。

email.py 經過異步發送電子郵件

decorators.py是爲了讓視圖函數只對具備特定權限的用戶開放,而使用的檢查用戶權限的自定義修飾器。代碼裏兩個修飾器,一個@permission_required用來檢查常規權限,一個@admin_required專門用來檢查管理員權限。這些自定義的修飾器會在路由視圖函數中被使用
例如:

@main.route('/admin')
@login_required
@admin_required
def for_admins_only():
    return "For administrators!"

model.py爲數據庫模型的代碼部分,UserMixi是用於認證的Flask-Login擴展提供的一個類,能實現大多數認證的方法。最後,Flask-Login要求程序實現一個回調函數load_user,使用指定的標識符加載用戶.加載用戶的回調函數接收以Unicode字符串形式表示的用戶標識符。若是能找到用戶,這個函數必須返回用戶對象;不然應該返回 None。

...
class Permission   '''定義權限常量'''
class Role(db.Model)    '''定義角色模型'''   
class User(UserMixin, db.Model):    '''定義用戶模型'''    
class AnonymousUser(AnonymousUserMixin):    '''定義匿名用戶''' 
... 
@login_manager.user_loader
def load_user(user_id):
    return User.query.get(int(user_id))

剩下最主要的兩個藍本處理程序,main藍本和auth藍本。藍本下面包括了建立藍本對象init.py,表單forms.py,視圖函數view.py和錯誤處理error.py幾個子PY文件。這兩個藍本文件夾其實爲主要工程實現代碼文件(經過藍本處理),裏面的init.py負責建立藍本對象 ,並關聯此文件夾下的 view.py(路由處理)和error.py(錯誤程序)處理。在error.py和view.py的代碼下經過已建立的藍本對象來進行處理相關程序。其中view.py代碼會調用文件夾中的form表單。

clipboard.png

在app/main/__init__.py實現建立main藍本,from . import views, errors能把main文件夾下的路由模版和錯誤處理程序模版與藍本關聯起來。注意,這些模塊在app/main/__init__.py腳本的末尾導入,這是爲了不循環導入依賴,由於在views.py和errors.py中還要導入藍本 main。def inject_permissions()函數爲了不每次調用 render_template() 時都多添加一個模板參數,把Permission類加入模板上下文,使其全局可訪問。

from flask import Blueprint
main = Blueprint('main', __name__)
from . import views, errors
from ..models import Permission

@main.app_context_processor
def inject_permissions():
    return dict(Permission=Permission)

框架內容大體就是這樣,也在起步學Flask_web,不少地方可能寫的不對,歡迎你們交流指出。

轉載請署名



最後還有一些學習過程當中查閱的技能流相關資料

-------------------------------------------不羈的分割線----------------------------------------------

快速入門Flask: http://docs.jinkan.org/docs/f...

安裝和使用SourceTree的Git客戶端:http://www.jianshu.com/p/6d27...

⭐GUI for git|SourceTree|入門基礎 : http://www.jianshu.com/p/be9f...

理解git的分支Branch :http://blog.csdn.net/lixiaoka...

⭐git分支詳解:http://blog.csdn.net/selagine...

使用VirtualEnv虛擬環境(Pycharm) http://blog.csdn.net/langkew/... (選擇Epython3.6.3Scriptsenvnscriptsptrhon.exe)
進入源代碼目錄下,執行virtualenv venv命令便可建立一個名爲venv的子文件夾,用來保存一個全新的虛擬環境,但使用以前
須要激活,window下激活命令爲venvScriptsactivate,爲了提醒你已經激活了虛擬環境,激活虛擬環境的命令提示符會變爲(venv) 當虛擬環境的工做完成後,若是你想回到全局的python解釋器中,能夠在命令行提示符下輸入deactivate

Flask路由系統:http://www.jianshu.com/p/e690...

程序上下文和請求上下文的區別(須要激活):https://segmentfault.com/q/10...
https://www.zhihu.com/questio... 不過有一點須要注意的是:在建立「請求上下文」時必定要建立一個「應用上下文」對象。有了「應用上下文」對象,即可以很容易地肯定當前處理哪一個應用。更像是一個容器,給這個容器注入一些變量,這些變量不只能在視圖方法中用,還能在其餘函數中用(尤爲是應用上下文,應用在其餘地方更爲普遍),由於都在這個容器裏。「應用上下文」存在的一個主要功能就是肯定請求所在的應用。

渲染模板:https://www.liaoxuefeng.com/w...

什麼是web表單:http://www.lmlblog.com/2223.html
Flask表單:表單的建立與渲染:https://zhuanlan.zhihu.com/p/...

flask-SQLAlchemy的初級使用教程:https://www.cnblogs.com/alima...

數據庫主鍵和外鍵:https://www.cnblogs.com/feng9...

使用格式工廠函數:http://blog.csdn.net/hyman_c/...
http://blog.csdn.net/rubik_wo...
發現register_blueprint()函數的做用就是把藍本對象main註冊到了其一個list中blueprints,咱們能夠作這樣的猜測,當用戶在輸入URL中,程序內部會從app類中的藍本list中找到這個藍本對象main,而後再從main中找到對應的templates或者static資源路徑
這裏flask web 開發那本書沒有說到的一點就是,flask的全部擴展都被設計成了能夠先建立應用程序,而後再導入app 應用變量,由於如上面的 db=sqlalchemy() 都是全局的,而app 則能夠有不止一個,因此設計成了先建立應用程序擴展,再綁定app,再經過form_object導入 實現好的config 配置 其中的一些配置在經過init_app傳入相應程序中,最後經過 crate_app()來進行調用, os.getenv()來獲取環境變量中的flask_config.而後執行。

如何理解flask中的藍本:https://www.zhihu.com/questio...

Python 的@用法:http://blog.csdn.net/Sean_ran...
@property:https://www.liaoxuefeng.com/w...

相關文章
相關標籤/搜索