Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
[CS Foundation] Web - 6 - Flask Introduction
Search
x-village
August 16, 2018
Programming
270
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
120
[CS Foundation] Web - 7 - CRUD in Flask
xvillage
0
140
[CS Foundation] Web - 4 - JavaScript Web Course
xvillage
0
48
[CS Foundation] Web - 5 - Database
xvillage
0
68
[CS Foundation] AIML - 3 - Common Issue
xvillage
1
170
[CS Foundation] AIML - 4 - Classification
xvillage
0
51
[CS Foundation] Web - 1 - Web Course intro
xvillage
2
38
[CS Foundation] Web - 2 - HTML and CSS Web Course
xvillage
0
62
[CS Foundation] Web - 3 - css layout
xvillage
0
100
Other Decks in Programming
See All in Programming
決定論的オーケストレーションの設計と実装 / Design and Implementation of Deterministic Orchestration
nrslib
4
1.6k
関数型プログラミングのメリットって何だろう?
wanko_it
0
140
Embedded SREと共に達成した会員管理システムのAWS移行 - SRE NEXT 2026 ランチスポンサーセッション
niftycorp
PRO
0
320
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
570
エージェンティックRAGにAWSで入門しよう!
har1101
9
1.9k
エンジニアにデザインハーネスを 〜デザインプロセスを規定するためのハーネス〜 / Design harness from an engineer's perspective
rkaga
2
740
Vite+ Unified Toolchain for the Web
naokihaba
0
660
【SRE NEXT 2026 Lunch Session】一人目専任SREの立ち上げを加速する ― AIと進めたオンボーディングで2分を0.04秒にした話
pkshadeck
PRO
0
350
symfony/aiとlaravel/boost
77web
0
120
どこまでゆるくて許されるのか
tk3fftk
0
340
20260623_Loop Engineeringで自分の分身の問い合わせBotを作る
ryugen04
0
130
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
0
390
Featured
See All Featured
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
Skip the Path - Find Your Career Trail
mkilby
1
160
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
380
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
550
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
200
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.6k
Designing Powerful Visuals for Engaging Learning
tmiket
1
440
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
580
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
860
The Language of Interfaces
destraynor
162
27k
Ruling the World: When Life Gets Gamed
codingconduct
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