Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
[CS Foundation] Web - 6 - Flask Introduction
Search
x-village
August 16, 2018
Programming
280
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
[CS Foundation] Web - 6 - Flask Introduction
x-village
August 16, 2018
More Decks by x-village
See All by x-village
[CS Foundation] AIML - 5 - Deep Learning
xvillage
1
130
[CS Foundation] Web - 7 - CRUD in Flask
xvillage
0
150
[CS Foundation] Web - 4 - JavaScript Web Course
xvillage
0
67
[CS Foundation] Web - 5 - Database
xvillage
0
76
[CS Foundation] AIML - 3 - Common Issue
xvillage
1
180
[CS Foundation] AIML - 4 - Classification
xvillage
0
60
[CS Foundation] Web - 1 - Web Course intro
xvillage
2
47
[CS Foundation] Web - 2 - HTML and CSS Web Course
xvillage
0
72
[CS Foundation] Web - 3 - css layout
xvillage
0
110
Other Decks in Programming
See All in Programming
作って学ぶSpring BootのAuto Configuration / JJUG Night Seminar 2026-10-19
rshindo
0
140
TechTown - Creating Composable Callables in Contemporary C++
rollbear
0
130
AIで開発が速くなった先で、開発チームは何を目指すか
shihochan
0
920
golang-bob.pdf
iwatsukayura
0
130
残高管理から台帳サービスへの進化
artoy
1
200
When benchmarks go bad - what I learned from measuring performance wrong
hollycummins
0
220
機械に任せるテスト、人が見るテスト ⽣成AIで引き直した、運⽤保守フェーズの線引き
dske104
0
190
コードで差別化できない時代の ソフトウェアエンジニアリング / Software Engineering in an Era Where Code Doesn’t Differentiate
kishida
2
180
[Dev Group Paris Octobre 26] Agentforce, SIforce, Claudeforce, Slackbot… on s'y retrouve ?
nabondance
0
110
動作中のプログラムの中身をリアルタイムに覗く / Realtime Debugger for CSharp with Roslyn
prota
1
1.9k
AWSに止められる覚悟してますか?
morizo_1984
2
530
Domain-Driven Transformation
hschwentner
2
2.3k
Featured
See All Featured
Believing is Seeing
oripsolob
1
240
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
330
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
460
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
203
77k
Music & Morning Musume
bryan
48
7.4k
From π to Pie charts
rasagy
1
400
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.9k
Automating Front-end Workflow
addyosmani
1369
210k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
480
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
270
Transcript
Flask Introduction Frank Yang
Outline • Model-View-Controller (MVC) • Flask • Flask-SQLAlchemy • Flask-Migrate
為什什麼需要框架?
<html lang="en"> <head> <meta charset="UTF-8"> <title>X-Village</title> <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script> </head> <body>
<div id="div1"> ... </div> <script> $('#div1')... </script> </body> </html>
<html lang="en"> <head> <meta charset="UTF-8"> <title>X-Village</title> <script src=“https://code.jquery.com/jquery-3.3.1.min.js"></script> ... </head>
<body> <div id="div1"> ... <div id="div2"> ... </div> </div> <script> $('#div1')... </script> <script> $('#div2')... </script> </body> </html>
<html lang="en"> <head> <meta charset="UTF-8"> <title>X-Village</title> <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script> </head> <body>
<div id="div1"> ... <div id="div2"> ... <div id="div3">...</div> </div> </div> <script> $('#div1')... </script> <script> $('#div2')... </script> <script> $('#div3')... </script> </body> </html>
<html lang="en"> <head> <meta charset="UTF-8"> <title>X-Village</title> <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script> </head> <body>
<div id="div1" style="color:red;"> ... <div id="div2" style="color:blue;"> ... <div id="div3" style="color:green;">...</div> </div> </div> <script> $('#div1')... </script> <script> $('#div2')... </script> <script> $('#div3')... </script> </body> </html>
沒有框架的專案像⼀一團⽑毛球
後端包含了了哪些部分?
Browser
Browser Server http://…/…
Browser Server Database http://…/… SQL
Browser Server Database http://…/… SQL Data
Browser Server Database http://…/… html, json, … SQL Data
Browser Server Database • 保持喚醒 http://…/… html, json, … SQL
Data
Browser Server Database • 保持喚醒 • 接收 HTTP Request,判斷 URL
http://…/… html, json, … SQL Data
Browser Server Database • 保持喚醒 • 接收 HTTP Request,判斷 URL
• 邏輯操作 http://…/… html, json, … SQL Data
Browser Server Database • 保持喚醒 • 接收 HTTP Request,判斷 URL
• 邏輯操作 • 操作 Database http://…/… html, json, … SQL Data
Browser Server Database • 保持喚醒 • 接收 HTTP Request,判斷 URL
• 邏輯操作 • 操作 Database • 回傳 HTML, JSON, … http://…/… html, json, … SQL Data
def server(): while True: # 保持喚醒
def server(): while True: # 保持喚醒 # 接收 HTTP Request
# ...
def server(): while True: # 保持喚醒 # 接收 HTTP Request
# ... # 判斷 URL # if ...
def server(): while True: # 保持喚醒 # 接收 HTTP Request
# ... # 判斷 URL # if ... # 操作 Database # SELECT ...
def server(): while True: # 保持喚醒 # 接收 HTTP Request
# ... # 判斷 URL # if ... # 操作 Database # SELECT ... # 回傳 HTML, JSON, ... # return '<html>..</html>'
def server(): while True: # 保持喚醒 # 接收 HTTP Request
# ... # 判斷 URL # if ... # 操作 Database # SELECT ... # 回傳 HTML, JSON, ... # return '<html>..</html>' if __name__ == '__main__': server()
另⼀一團⽑毛球...
沒有架構好的程式碼 會隨著需求變化,越來來越難管理理 所以我們需要⼀一個好的架構
⼤大多數後端框架都依循 MVC
Browser
Browser Controller URL
Browser Controller Model URL
Browser Controller Model URL Database
Browser Controller Model URL Database View
MVC • Controller • 接收 HTTP Request,判斷 URL • 邏輯操作
• Model • 操作 Database • View • 回傳 HTML
什什麼是 Flask?
Flask 是⼀一個以 Python 為基礎的後端框架
Install Flask pip install Flask
Flask Hello World # app.py from flask import Flask app
= Flask(__name__) @app.route("/") def hello(): return "Hello World!" $: flask run * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
Exercise 1 讓網站在連結 http://127.0.0.1:5000/name 顯⽰示 Hello <Your name>
Exercise 1 # app.py from flask import Flask app =
Flask(__name__) @app.route("/") def hello(): return "Hello World!" @app.route("/name") def name(): return "Hello Frank"
Browser Controller URL View
Browser Controller URL Model Database View
Flask 如何操作 Database?
Install Flask-SQLAlchemy pip install Flask-SQLAlchemy
Connect Database # app.py from flask import Flask from flask_sqlalchemy
import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db' db = SQLAlchemy(app)
如何透過 Python 物件操作 Database?
如何透過 Python 物件操作 Database? Object-Relational Mapping (ORM)
Object-Relational Mapping (ORM) 將 Database 欄欄位映射為 Python 物件
Object-Relational Mapping class Record(db.Model): id = db.Column(db.Integer, primary_key=True) name =
db.Column(db.String(120), nullable=True)
Object-Relational Mapping class Record(db.Model): id = db.Column(db.Integer, primary_key=True) name =
db.Column(db.String(120), nullable=True)
Object-Relational Mapping class Record(db.Model): id = db.Column(db.Integer, primary_key=True) name =
db.Column(db.String(120), nullable=True)
Object-Relational Mapping class Record(db.Model): id = db.Column(db.Integer, primary_key=True) name =
db.Column(db.String(120), nullable=True) record = Record(id=1, name='test') record.id # 1 record.name # 'test' 透過物件操作 Database
Flask-SQLAlchemy # app.py from flask import Flask from flask_sqlalchemy import
SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db' db = SQLAlchemy(app) class Record(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(120), nullable=True)
Create Database $ python >>> from app import db >>>
db.create_all()
如果想再新增欄欄位,可以再⽤用⼀一次 db.create_all() 嗎?
如果想再新增欄欄位,可以再⽤用⼀一次 db.create_all() 嗎? 不⾏行行!因為 Database 不會做任何更更動
請使⽤用 Flask-Migration
Install Flask-Migrate pip install Flask-Migrate
Flask-Migrate # app.py from flask import Flask from flask_sqlalchemy import
SQLAlchemy from flask_migrate import Migrate app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db' db = SQLAlchemy(app) migrate = Migrate(app, db) class Record(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(120), nullable=True)
Flask-Migrate: init $: flask db init . "## app.py $##
migrations "## README "## alembic.ini "## env.py "## script.py.mako $## versions
Flask-Migrate: migrate $: flask db migrate . "## app.py "##
migrations % "## README % "## alembic.ini % "## env.py % "## script.py.mako % $## versions % $## 130e52081025_.py $## test.db
Flask-Migrate: upgrade $: flask db upgrade
可以開始新增欄欄位了了!
Flask-Migrate: 新增欄欄位 # app.py from flask import Flask from flask_sqlalchemy
import SQLAlchemy from flask_migrate import Migrate app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db' db = SQLAlchemy(app) migrate = Migrate(app, db) class Record(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(120), nullable=True) cost = db.Column(db.Integer, nullable=True)
Flask-Migrate: 新增欄欄位 $: flask db migrate . "## app.py "##
migrations % "## README % "## alembic.ini % "## env.py % "## script.py.mako % $## versions % $## 130e52081025_.py % $## afb3b6c950b7_.py $## test.db
Flask-Migrate: 新增欄欄位 $: flask db upgrade
Flask-Migrate: 新增欄欄位 ⼀一旦 flask db init 初始化設定好,之後 要更更新 Database 只需要:
$: flask db migrate $: flask db upgrade