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
130
[CS Foundation] Web - 4 - JavaScript Web Course
xvillage
0
41
[CS Foundation] Web - 5 - Database
xvillage
0
62
[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
37
[CS Foundation] Web - 2 - HTML and CSS Web Course
xvillage
0
58
[CS Foundation] Web - 3 - css layout
xvillage
0
100
Other Decks in Programming
See All in Programming
AIとRubyの静的型付け
ukin0k0
0
550
運用エージェントは "作る" から "育てる" へ - 記憶と自己進化の3層設計パターン / self-evolving-agents-three-layer-agent-design
gawa
12
3.5k
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
320
GitHub Copilot CLIのいいところ
htkym
2
1.3k
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
3
600
作って学ぶ、 JSX (TSX) ランタイムの基本
syumai
7
1.6k
Agentic UI
manfredsteyer
PRO
0
110
AIで効率化できた業務・日常
ochtum
0
110
AIエージェントの隔離技術の徹底比較
kawayu
0
470
決定論的オーケストレーションの設計と実装 / Design and Implementation of Deterministic Orchestration
nrslib
3
1.2k
Skillsは効率化、Agentsは"自分の拡張"——Builder時代のエージェント編成(CC Night 2026)
wemra
1
110
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
220
Featured
See All Featured
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.6k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.8k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
240
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.5k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
290
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
エンジニアに許された特別な時間の終わり
watany
107
250k
Statistics for Hackers
jakevdp
799
230k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
360
How to Talk to Developers About Accessibility
jct
2
220
Are puppies a ranking factor?
jonoalderson
1
3.5k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
430
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