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
61
[CS Foundation] Web - 5 - Database
xvillage
0
73
[CS Foundation] AIML - 3 - Common Issue
xvillage
1
180
[CS Foundation] AIML - 4 - Classification
xvillage
0
57
[CS Foundation] Web - 1 - Web Course intro
xvillage
2
46
[CS Foundation] Web - 2 - HTML and CSS Web Course
xvillage
0
70
[CS Foundation] Web - 3 - css layout
xvillage
0
110
Other Decks in Programming
See All in Programming
一人だけ、Kiroが静止する日
hideg
0
130
WebRTC映像をAirPlayに対応させる挑戦.pdf
monolithic_adam
0
310
Security issues being discussed on Web Platforms
petamoriken
0
1.3k
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
430
新卒PdEのリアル
ryu1013
1
520
The Rails Doctrine Decade
koic
2
400
IBM Bob Dojo #1 仕様駆動開発入門
oniak3ibm
PRO
0
280
JPUG勉強会 OSSデータベースの内部構造を理解しよう(第2回)
oga5
0
270
iOSDCのペンライトを自動制御したい!
akkeylab
0
100
動作中のプログラムの中身をリアルタイムに覗く / Realtime Debugger for CSharp with Roslyn
prota
1
1.5k
難しいけど、読めた。- OSSの入口に立った話。
sts11142
0
120
AHC070解法紹介
eijirou
0
140
Featured
See All Featured
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.8k
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.2k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
470
How to make the Groovebox
asonas
2
2.5k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
390
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.9k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
370
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.6k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
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