零基礎入門python web框架Flask開發(fā)

Flask框架是Python開發(fā)的一個基于Werkzeug和Jinja 2的web開發(fā)微框架顿锰,它的優(yōu)勢就是極其簡潔,但又非常靈活,而且容易學習和應用进泼。因此Flask框架是Python新手快速開始web開發(fā)最好的選擇,此外纤虽,使用Flask框架的另一個好處在于你可以非常輕松地將基于Python的機器學習算法或數(shù)據(jù)分析算法集成到web應用中乳绕。

如果希望深入學習Flask Web開發(fā),推薦這個教程:
深入淺出Flask

1逼纸、可以用Flask框架做什么

從博客應用到克隆一個facebook或者twitter洋措,理論上你可以用Flask做任何事情。有很多庫可以直接使用杰刽,例如flask-sockets菠发,flask-google-maps等,而且Flask框架支持MySQL贺嫂、Postgresql滓鸠、MongoDB等諸多數(shù)據(jù)庫。

我能想到的一些可以用Flask框架實現(xiàn)的web應用類型:博客應用第喳、聊天應用糜俗、儀表盤應用、RESTAPI曲饱、管理頁面悠抹、郵件服務等。

安裝Flask

使用pip安裝Flask:

$ pip install flask

2扩淀、Hello,World

創(chuàng)建一個文件app.py楔敌,然后只需要幾個簡單的步驟,就可以寫出Flask版本的Hello World

  1. 引入Flask類
from flask import Flask
  1. 創(chuàng)建Flask對象驻谆,我們將使用該對象進行應用的配置和運行:
app = Flask(__name__)

name 是Python中的特殊變量卵凑,如果文件作為主程序執(zhí)行庆聘,那么__name__變量的值就是__main__,如果是被其他模塊引入勺卢,那么__name__的值就是模塊名稱掏觉。

  1. 編寫主程序

在主程序中,執(zhí)行run()來啟動應用:

if __name__ =="__main__":
    app.run(debug=True, port=8080)

改名啟動一個本地服務器值漫,默認情況下其地址是localhost:5000澳腹,在上面的代碼中,我們使用關(guān)鍵字參數(shù)port將監(jiān)聽端口修改為8080杨何。

  1. 路由

使用app變量的route()裝飾器來告訴Flask框架URL如何觸發(fā)我們的視圖函數(shù):

@app.route('/')
def hello_world():
    return 'Hello, World!'

上面的標識酱塔,對路徑'/'的請求,將轉(zhuǎn)為對hello_world()函數(shù)的調(diào)用危虱。很直白羊娃,對吧?

  1. 運行

現(xiàn)在埃跷,讓我們完整地看一下app.py的整個代碼:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

if __name__ =="__main__":
    app.run(debug=True,port=8080)

然后運行起來:

$ python app.py

你應該會看到如下輸入:

* Serving Flask app "app" (lazy loading)
* Environment: production
* Debug mode: on
* Running on http://127.0.0.1:8080/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 770-937-705

現(xiàn)在就可以打開瀏覽器訪問http://127.0.0.1:8080/了:

hello world

3蕊玷、使用HTML模板

首先我們看看如何原始的HTML代碼插入Flask應用:

from flask import Flask
app = Flask(__name__)


@app.route('/greet')
def greet():
    user = {'username': 'John', 'age': "20"}
    return '''
<html>
    <head>
        <title>Templating</title>
    </head>
    <body>
        <h1>Hello, ''' + user['username'] + '''!, you’re ''' + user['age'] + ''' years old.</h1>
    </body>
</html>'''


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

在上面的代碼中,我們使用拼接的HTML字符串來展示user字典的數(shù)據(jù)∶直ⅲ現(xiàn)在訪問http://127.0.0.1:8080/greet

hello world

拼接HTML字符串非常容易出錯垃帅,因此Flask使用Jinja 2模板引擎來分離數(shù)據(jù)邏輯和展示層。

我們將模板文件按如下路徑放置:

Apps folder
/app.py
templates
   |-/index.html

使用模板時剪勿,視圖函數(shù)應當返回render_template()的調(diào)用結(jié)果贸诚。例如下面的代碼片段渲染模板index.html,并將渲染結(jié)果作為視圖函數(shù)的返回值:

from flask import Flask, render_template
app = Flask(__name__)

@app.route('/hello')
def hello():
    return render_template('index.html', name="Alex")

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

在上面的代碼中厕吉,模板文件index.html依賴于變量name酱固,其內(nèi)容如下:

<html>
<body>
  {% if name %}
    <h2>Hello {{ name }}.</h2>
  {% else %}
    <h2>Hello.</h2>
  {% endif %}
 </body>
</html>

模板文件的語法擴充了HTML,因此可以使用變量和邏輯头朱。

在瀏覽器中訪問http://127.0.0.1:8080/hello/alex

hello world

4运悲、使用表單

每個web應用都需要使用表單來采集用戶數(shù)據(jù)。現(xiàn)在讓我們使用Flask框架創(chuàng)建一個簡單的表單來收集用戶的基本信息项钮,例如名稱班眯、年齡、郵件寄纵、興趣愛好等鳖敷,我們將這個模板文件命名為bio_form.html

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <h1>Bio Data Form</h1>
    <form action="showbio">
        <label>Username</label>
        <input type="name" name="username"><br>
        <label>Email</label>
        <input type="email" name="email"><br>
        <label>Hobbies</label>
        <input type="name" name="hobbies"><br>
        <input type="submit" name="">
    </form>
</body>
</html> 

視圖函數(shù)bio_data_form同時支持POST和GET請求。GET請求將渲染bio_form.html模板程拭,而POST請求將重定向到showbio

@app.route('/form', methods=['POST', 'GET'])
def bio_data_form():    
    if request.method == "POST":
        username = request.form['username']        
        age = request.form['age']        
        email = request.form['email']        
        hobbies = request.form['hobbies']        
        return redirect(url_for('showbio',                              
                                username=username,
                                age=age,
                                email=email,   
                                hobbies=hobbies))    
    return render_template("bio_form.html")

下面是showbio的實現(xiàn):

@app.route('/showbio', methods=['GET'])
def showbio():    
    username = request.args.get('username')    
    age = request.args.get('age')    
    email = request.args.get('email')    
    hobbies = request.args.get('hobbies')    
    return render_template("show_bio.html",
                           username=username,                         
                           age=age,                          
                           email=email,                         
                           hobbies=hobbies)

以及show_bio.html的內(nèi)容:

<!DOCTYPE html>
<html>
<head>
    <title>Bio-Data Details</title>
</head>
<body>
    <h1>Bio-Data Details</h1>
    <hr>
    <h1>Username: {{ username }}</h1>
    <h1>Email: {{ email }}</h1>
    <h1>Hobbies: {{ hobbies }}</h1>
</body>
</html>

5、數(shù)據(jù)庫集成:使用SQLAlchemy

Flask不能直接連接數(shù)據(jù)庫棍潘,需要借助于ORM(Object Relational Mapper)恃鞋。在這一部分崖媚,我們將借助于SQLAlchemy使用Postgres數(shù)據(jù)庫。

  1. 安裝Flask-SQLAlchemy和Postgres

首先安裝flask-sqlalchemy:

$ pip install flask-sqlalchemy

然后從官方下載并安裝postgres:https://postgresapp.com/

  1. 創(chuàng)建數(shù)據(jù)庫

在終端中使用下面的命令創(chuàng)建一個appdb數(shù)據(jù)庫:

$ createdb appdb
  1. 更新應用配置

修改app.config恤浪,添加數(shù)據(jù)庫相關(guān)的配置信息:

app.config['DEBUG'] = True
app.config['SQLALCHEMY_DATABASE_URI']='postgresql://localhost/appdb'
SQLALCHEMY_TRACK_MODIFICATIONS = True
db = SQLAlchemy(app)

然后在代碼中就可以使用這些配置數(shù)據(jù)了:

from flask import Flask, request, render_template
from flask_sqlalchemy import SQLAlchemy

# Settings
app = Flask(__name__)
app.config['DEBUG'] = True
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://localhost/appdb'
db = SQLAlchemy(app)

@app.route('/')
def hello_world():
    return 'Hello, World!'

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

現(xiàn)在畅哑,讓我們創(chuàng)建第一個模型(Model)。所有模型的基類是db.Model水由,使用Column來定義數(shù)據(jù)列:

class Post(db.Model):
    id = db.Column(db.Integer(), primary_key=True)
    title = db.Column(db.String(80), unique=True)
    post_text = db.Column(db.String(255))
    
    def __init__(self, title, post_text):
        self.title = title
        self.post_text = post_text

在代碼中使用模型:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://localhost/testdb'

db = SQLAlchemy(app)


class Post(db.Model):
    id = db.Column(db.Integer(), primary_key=True)
    title = db.Column(db.String(80), unique=True)
    post_text = db.Column(db.String(255))

    def __init__(self, title, post_text):
        self.title = title
        self.post_text = post_text


@app.route('/')
def index():
    return "Hello World"


app = Flask(__name__)

if __name__ == "__main__":
    app.run()

6荠呐、模型-數(shù)據(jù)同步

使用ORM時,需要執(zhí)行遷移操作以便在模型和持久化數(shù)據(jù)之間保持同步砂客。我們使用Flask-Migrate這個擴展來完成該任務泥张。

首先安裝:

$ pip install flask-migrate
$ pip install flask_script

然后在代碼中引入:

from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand

進行必要的配置:

migrate = Migrate(app, db)
manager = Manager(app)
manager.add_command('db', MigrateCommand)

運行管理器:

if __name__ == '__main__':
    manager.run()

完整的代碼如下:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://localhost/appdb'

db = SQLAlchemy(app)
migrate = Migrate(app, db)
manager = Manager(app)
manager.add_command('db', MigrateCommand)


class Post(db.Model):
    id = db.Column(db.Integer(), primary_key=True)
    title = db.Column(db.String(80), unique=True)
    post_text = db.Column(db.String(255))

    def __init__(self, title, post_text):
        self.title = title
        self.post_text = post_text


@app.route('/')
def index():
    return "Hello World"


if __name__ == "__main__":
    manager.run()

使用如下的命令初始化Alembic:

$ python app.py db init
Creating directory /Users/Vihar/Desktop/flask-databases/migrations ... done
...
...
...
Generating /Users/Vihar/Desktop/flask-databases/migrations/alembic.ini ... done

執(zhí)行第一個遷移任務:

$ python app.py db migrate
INFO  [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO  [alembic.runtime.migration] Will assume transactional DDL.
INFO  [alembic.autogenerate.compare] Detected added table 'post'

Generating /Users/Vihar/Desktop/flask-databases/migrations/versions/ed3b3a028447_.py ... done

一旦上述命令執(zhí)行完畢,我們的數(shù)據(jù)表就會創(chuàng)建成功【现担現(xiàn)在更新數(shù)據(jù)庫:

$ python app.py db upgrade
orm

匯智網(wǎng)翻譯整理媚创,轉(zhuǎn)載請標明出處。原文鏈接:Flask框架web開發(fā):零基礎入門

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末彤恶,一起剝皮案震驚了整個濱河市钞钙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌声离,老刑警劉巖芒炼,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異术徊,居然都是意外死亡焕议,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門弧关,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盅安,“玉大人,你說我怎么就攤上這事世囊”鸩t!?“怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵株憾,是天一觀的道長蝙寨。 經(jīng)常有香客問我,道長嗤瞎,這世上最難降的妖魔是什么墙歪? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮贝奇,結(jié)果婚禮上虹菲,老公的妹妹穿的比我還像新娘。我一直安慰自己掉瞳,他們只是感情好毕源,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布浪漠。 她就那樣靜靜地躺著,像睡著了一般霎褐。 火紅的嫁衣襯著肌膚如雪址愿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天冻璃,我揣著相機與錄音响谓,去河邊找鬼。 笑死省艳,一個胖子當著我的面吹牛娘纷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拍埠,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼失驶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了枣购?” 一聲冷哼從身側(cè)響起嬉探,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎棉圈,沒想到半個月后涩堤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡分瘾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年胎围,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片德召。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡白魂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出上岗,到底是詐尸還是另有隱情福荸,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布肴掷,位于F島的核電站敬锐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏呆瞻。R本人自食惡果不足惜台夺,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望痴脾。 院中可真熱鬧颤介,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽薯定。三九已至始绍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間话侄,已是汗流浹背亏推。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留年堆,地道東北人吞杭。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像变丧,于是被迫代替她去往敵國和親芽狗。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容