1. 程式人生 > >Flask藍圖使用的方法

Flask藍圖使用的方法

之前我們已經通過程式碼瞭解了一些Flask基本的用法,現在出現一個問題,我們要做的功能越來越多,路由是不是都要放在啟動類中呢?例如我們在不同的檔案都定義了一些路由,如果想要訪問他們,是不是要開啟很多個不同的服務呢?Flask中提供了藍圖,專門用作Flask的模組化。對於藍圖,可以看官方介紹,這裡翻譯過來的:Flask使用藍圖的概念來製作應用程式元件和支援應用程式內部或跨應用程式的通用模式。藍圖可以大大簡化大型應用程式的工作方式,併為Flask擴充套件提供了在應用程式上註冊操作的中心手段。Blueprint物件的工作方式與Flask應用程式物件類似,但實際上它不是一個應用程式。相反,它是如何構造或擴充套件應用程式的藍圖。總之,藍圖可以使我們的程式更加模組化,不同功能的路由可以放在不同的模組下,最後集中到啟動類中。下面看一個例子來學習使用藍圖,以上一篇程式碼為基礎,略微修改幾處。

分路由類:

from flask import Flask, render_template, Blueprint

app = Flask(__name__)
test1 = Blueprint('test1', __name__)
@test1.route('/test')
def test():
    return render_template('test1.html')

分路由類:

#encoding:utf-8
#!/usr/bin/env python
from flask import Flask, render_template, request, redirect, url_for, session, flash, Blueprint
import sys
reload(sys)
sys.setdefaultencoding('utf8')
app = Flask(__name__)
form_test = Blueprint('form_test', __name__)

app.config['SECRET_KEY'] = 'my'
app.secret_key = 'my'

@form_test.route('/index')
def index():
    return render_template('test1.html')

@form_test.route('/login', methods=['get', 'post'])
def login():
    name = request.form.get('name')
    password = request.form.get('password')
    if name == 'admin' and password == '123':
        session['name'] = name
        return redirect(url_for('login'))
    if name != 'admin':
        flash('no this name')
    return render_template('test1.html', name=session.get('name'))

主路由啟動類:

#encoding:utf-8
#!/usr/bin/env python
from flask import Flask, render_template
from test1 import test1
from form_test import form_test
from flask_script import Manager
app = Flask(__name__)
app.register_blueprint(form_test)
app.register_blueprint(test1)

@app.route('/')
def index():
    num = ['tom', 'mike', 'amuxia', 'zhao', 'lisi']
    return render_template('/index.html', num=num)

@app.errorhandler(404)
def miss(e):
    return render_template('404.html'), 404

@app.errorhandler(500)
def error(e):
    return render_template('500.html'), 500

if __name__=='__main__':
    print(app.url_map)
    app.run()

看以上程式碼大家應該也明白了,分路由中由form_test = Blueprint('form_test', __name__)建立藍圖,而後在主路由中通過app.register_blueprint(form_test)注入。