Flask開發初探
介紹
在日常開發中,如果需要開發一個小型應用或者Web接口,一般我是極力推崇Flask的,主要是因為其簡潔、擴展性高。
從這篇文章開始,我會寫一個關於Flask的系列文章,通過多個實例,由淺入深,融入自己使用Flask的心得,希望能幫助更多朋友學習Flask。
在此之前,建議你了解常見理論(包括視圖、模板等),閱讀Flask的官方文檔,了解sqlalchemy,有一定的前端基礎。
開發環境:ubuntu + Python2.7X + mysql
本系列文章代碼將持續更新於 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和圖片等資源文件。那么具體如何使用呢?
這里在上述實例的基礎上,使用模板和靜態文件在界面中加載出"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”即可看到以下界面:
以上,就是本篇文章介紹的全部內容,歡迎探討。