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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
ローカルLLMを使ってB2Bサービスを作っていての学び
yaotti
0
150
New "Type" system on PicoRuby
pocke
1
600
Swiftのレキシカルスコープ管理
kntkymt
0
220
Oxcを導入して開発体験が向上した話
yug1224
4
290
AIチームを指揮するOSS「TAKT」活用術 / How to Use “TAKT,” an OSS Tool for Orchestrating AI Teams
nrslib
6
840
エージェンティックRAGにAWSで入門しよう!
har1101
8
1.3k
Skillsは効率化、Agentsは"自分の拡張"——Builder時代のエージェント編成(CC Night 2026)
wemra
1
110
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
12k
AIエージェントと協働するCLI開発 — BunとOpenClawで学んだこと
yoshikouki
1
240
決定論的オーケストレーションの設計と実装 / Design and Implementation of Deterministic Orchestration
nrslib
3
1.2k
JavaDoc 再入門
nagise
0
300
Technical Debt: Understanding it Rightly, Engaging it Rightly #LaravelLiveJP
shogogg
0
200
Featured
See All Featured
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
320
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
71
40k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.6k
The Cost Of JavaScript in 2023
addyosmani
55
10k
KATA
mclloyd
PRO
35
15k
How to train your dragon (web standard)
notwaldorf
97
6.7k
Building an army of robots
kneath
306
46k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
560
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
220
Rebuilding a faster, lazier Slack
samanthasiow
85
9.5k
Information Architects: The Missing Link in Design Systems
soysaucechin
0
960
Navigating Weather and Climate Data
rabernat
0
210
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