Flask開發系列之初體驗

Flask開發初探

介紹

在平常開發中,若是須要開發一個小型應用或者Web接口,通常我是極力推崇Flask的,主要是由於其簡潔、擴展性高。css

從這篇文章開始,我會寫一個關於Flask的系列文章,經過多個實例,由淺入深,融入本身使用Flask的心得,但願能幫助更多朋友學習Flask。html

在此以前,建議你瞭解常見理論(包括視圖、模板等),閱讀Flask的官方文檔,瞭解sqlalchemy,有必定的前端基礎。前端

開發環境:ubuntu + Python2.7X + mysqlpython

本系列文章代碼將持續更新於 my githubmysql

一個最簡單的應用

首先介紹一個Flask中最簡單的應用,建立app.py,編寫:git

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"。github

關於這部分代碼的具體含義我很少作介紹,有疑問的朋友可參見這裏web

須要說明的是,若開發簡單應用(接口較少,不依賴數據庫等),可使用這種單文件模式生成的方式。當項目應用需求較大時,天然是不能使用單文件模式,由於這樣顯得笨重且不易維護,這時就須要考慮到項目結構了。sql

項目結構

對於Web開發,很重要的一點就是建立項目結構,接下來給你們分享下我經常使用的項目結構:數據庫

  • app
    • app
      • templates (MVC中的V,存放模板文件)
      • static (存放靜態文件,包括css和js文件等)
      • models (映射數據庫表結構)
      • utils (通用功能模塊)
      • __init__.py (模塊初始化文件)
      • views.py (MVC中的C,存放視圖函數)
      • config.py (配置文件)
    • manage.py (數據庫遷移文件)
    • serve.py (項目啓動文件)

着手開發

重要概念

開發以前呢,先簡單介紹這篇文章中關於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",以下:

  1. 在templates文件夾中建立home.html;
  2. 在static文件夾中建立style.css,並在home.html中引用;
  3. 在路由函數中,使用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」便可看到如下界面:

以上,就是本篇文章介紹的所有內容,歡迎探討。

相關文章
相關標籤/搜索