Flask開發系列之初體驗
Flask開發初探
介紹
在日常開發中,如果需要開發一個小型應用或者Web介面,一般我是極力推崇Flask的,主要是因為其簡潔、擴充套件性高。
從這篇文章開始,我會寫一個關於Flask的系列文章,通過多個例項,由淺入深,融入自己使用Flask的心得,希望能幫助更多朋友學習Flask。
在此之前,建議你瞭解常見理論(包括檢視、模板等),閱讀Flask的官方文件,瞭解sqlalchemy,有一定的前端基礎。
開發環境:ubuntu + Python2.7X + mysql
本系列文章程式碼將持續更新於 ofollow,noindex" target="_blank">my github
一個最簡單的應用
首先介紹一個Flask中最簡單的應用,建立app.py,編寫:
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello Flask!' if __name__ == '__main__': app.run()
使用命令python app.py,執行該指令碼,就啟動了該應用,在瀏覽器中輸入應用地址(一般是127.0.0.1:5000),便可檢視到"Hello Flask"。
關於這部分程式碼的具體含義我不多做介紹,有疑問的朋友可參見 這裡
需要說明的是,若開發簡單應用(介面較少,不依賴資料庫等),可以使用這種單檔案模式生成的方式。當專案應用需求較大時,自然是不能使用單檔案模式,因為這樣顯得笨重且不易維護,這時就需要考慮到專案結構了。
專案結構
對於Web開發,很重要的一點就是建立專案結構,接下來給大家分享下我常用的專案結構:
- app
- app
- templates (MVC中的V,存放模板檔案)
- static (存放靜態檔案,包括css和js檔案等)
- models (對映資料庫表結構)
- utils (通用功能模組)
- __init__.py (模組初始化檔案)
- views.py (MVC中的C,存放檢視函式)
- config.py (配置檔案)
- manage.py (資料庫遷移檔案)
- serve.py (專案啟動檔案)
- app
著手開發
重要概念
開發之前呢,先簡單介紹這篇文章中關於Flask很重要的幾個概念。
1. 路由:所謂路由,就是處理URL和函式之間關係的程式,Flask中也是對URL規則進行統一管理的,使用@app.route修飾器將一個函式註冊為路由。
2. 藍圖:程式設計講究的是功能模組化,從而使程式碼看起來更加的優雅和順暢, 在Flask中, 藍圖 可以將各個應用組織成不同的元件,實現程式碼的模組化。比如一個系統有兩種角色,一個是普通使用者user,另一個是管理員admin,那麼他們所擁有的許可權和功能有很大差異,若將其放在同一個檔案下,程式碼量相對較大且不易維護,若進行版本控制時,也很容易出現衝突,這時可以建立藍圖加以區分。
3. sqlalchemy:
SQLAlchemy是Python中最有名的的ORM框架,所謂的ORM(Object-Relational Mapping),就是將關係資料庫的表結構對映到物件上(程式中的類),可以將資料庫表中的一行記錄與一個物件互相做自動轉換。
它支援多種資料庫引擎,封裝了各種資料庫引擎(SQLite,MySQL,Postgresql,Oracle等),對於不同的資料庫,只需要做簡單的修改,工作量大大減少。
在Flask中,可以使用Flask-SQLAlchemy管理資料庫,使用命令安裝:
pip install flask-sqlalchemy
V1.0
第一個版本V1.0將建立專案目錄,介紹一個較為簡單的應用:結構化Flask專案,並簡單使用模板和靜態檔案進行前端展示。
建立藍圖
首先,在views.py中建立藍圖:
# coding:utf-8 from flask import Blueprint views = Blueprint('views', __name__)
然後,在__init__.py初始化應用,新增views藍圖:
# coding:utf-8 from flask import Flask from views import views def create_app(): app = Flask(__name__) app.register_blueprint(views) return app
檢視函式
這樣views藍圖被定義,使用views藍圖,開啟views.py,編寫檢視函式定義路由,這裡:
@views.route('/') def home(): return "Hello Flask!"
啟動指令碼
編寫專案啟動指令碼serve.py:
# coding:utf-8 from app import create_app app = create_app() if __name__ == "__main__": app.run(debug=True)
使用"python serve.py"命令執行該專案,便可在網頁上顯示"Hello Flask"。
使用模板和靜態檔案
在web開發中,我們自然是需要使用模板(template)和靜態檔案(static)來生成更加豐富的網頁。模板即是包含了程式頁面的html檔案,靜態檔案指的是需要在HTML檔案中載入的CSS、JavaScript/">JavaScript和圖片等資原始檔。那麼具體如何使用呢?
這裡在上述例項的基礎上,使用模板和靜態檔案在介面中加載出"Hello Flask",如下:
- 在templates資料夾中建立home.html;
- 在static資料夾中建立style.css,並在home.html中引用;
- 在路由函式中,使用render_template引用模板,如下:
# coding:utf-8 from flask import render_template, Blueprint views = Blueprint('views', __name__) @views.route('/') def home(): return render_template('home.html')
相應的,在templates資料夾中建立'home.html‘,執行"python serve.py"便可在網頁中顯示home.html中的內容Hello flask。

V1.1
這部分將在上一版本的基礎上,實現一個web應用中很常見的場景:提交表單與入庫操作,當然這個場景最典型的是註冊功能,那不妨以該功能舉例。
簡單說來,這裡我們的註冊功能就是收集驗證資料並存入資料庫。當然,為了保證資料安全性,這裡我們對使用者密碼進行加密。
使用資料庫
下面將以mysql舉例。
配置
首先,在config.py中配置資料庫:
# coding:utf-8 class Config(): SQLALCHEMY_DATABASE_URI = DATABASE_URL = "mysql://root:pwd@localhost/learn_flask?charset=utf8" SQLALCHEMY_TRACK_MODIFICATIONS = False"
接下來,在models中建立資料庫對映表,建立一個Users表,包括使用者名稱,郵箱,密碼三個欄位:
# coding:utf-8 from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() class Users(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(128), unique=True) email = db.Column(db.String(128)) password = db.Column(db.String(128)) def __init__(self, name, email, password): self.name = name self.email = email self.password = password
這樣,我們就完成了Users表的對映,那麼接下來,需要完成資料庫的初始化,以應用於該專案中,修改__init__.py檔案:
def create_app(config='app.config.Config'): app = Flask(__name__) with app.app_context(): app.config.from_object(config) from models import db, Users url = make_url(app.config['SQLALCHEMY_DATABASE_URI']) db.init_app(app) try: if not database_exists(url): create_database(url) db.create_all() except OperationalError: db.create_all() except ProgrammingError: pass else: db.create_all() app.db = db app.register_blueprint(views) return app
這時,啟動該專案,就會在mysql中建立資料庫“learn_flask”,說明資料庫配置正確。
註冊功能的實現
準備工作完畢,接下來就著手實現註冊功能。
為了體現模組化思想,我們不妨來建立一個user藍圖,用來編寫與使用者相關的所有功能,建立藍圖與初始化在V1.0中已介紹,在此不再贅述,正好給大家一個練手的機會。
接下來建立註冊檢視函式,並對傳入的使用者名稱、郵箱和密碼進行驗證:
@user.route('/register', methods=['POST', 'GET']) def register(): if request.method == 'POST': name = request.form['name'] email = request.form['email'] password = request.form['password'] repassword = request.form['repassword'] errors = judgemember(name, email) if password != repassword: errors.append('兩次密碼輸入不一致') if len(errors) > 0: return render_template('register.html', errors=errors) else: user = Users(name, email, password) db.session.add(user) db.session.commit() db.session.close() return redirect(url_for('views.home')) else: return render_template('register.html')
關於前端檔案,這裡就不列出來了,不熟悉Jinja的可以看下其具體的用法,具體程式碼見 my github
建立除錯完畢,開啟瀏覽器,訪問“/register”即可看到以下介面:
以上,就是本篇文章介紹的全部內容,歡迎探討。