準備
安裝:pip install flaskFlask
快速入門:http://docs.jinkan.org/docs/flask/quickstart.html#quickstart
快速構建
在項目根目錄下構建:
webapp包目錄,存放flask代碼,包內有__init__.py文件
templates目錄,存放模板文件
static目錄,存放js,css等靜態文件。其下建立js目錄,放入jquery、echarts的js文件
app.py入口文件
基本組成
目錄結構如下:
1.# /webapp/__init__.py文件內容 2.from flask import Flask,jsonify 3.#創建應用 4.app = Flask("myweb") 5..#路由和視圖函數 [email protected]("/") 7.def index(): 8.return "hello flask" 9. [email protected]("/json",methods=["GET"]) #列表中指定多個方法 11.def getjson(): 12.d = {"a":1,"b":2,"c":3} 13.return jsonify(d) #Mime是application/json 14. 15.#打印重要屬性 16.print(*filter(lambda x: not x[0].startswith("__") and x[1],app.__dict__.items()),sep="\n") 17.print("- "*30) 18.print(app.url_map) 19.print(app.template_folder) 20.print(app.static_folder) 21.print("- "*30)
應用:創建出來提供WEB服務的實例,也是wsgi的入口
視圖函數:執行內部代碼輸出響應的內容
路由:通過route裝飾器創建path到視圖函數的映射關係
1.#/main.py文件 2.from webapp import app 3. 4.if __name__ == "__main__": 5. app.run("127.0.0.1",port=8080,debug=True)
啓動main.py文件
藍圖
Flask中,基本上都是route裝飾器和視圖函數的映射,如果函數很多,代碼組織結構會非常亂。藍圖Blueprint,就是Flask中模塊化技術。
新建/web/app/books.py藍圖文件
1.#/webapp/books.py文件 2. 3.from flask import Blueprint,jsonify,render_template 4. 5.bpbooks = Blueprint("booksapp",__name__,url_prefix="/books") 6.# bpbooks = Blueprint("booksapp",__name__) [email protected]("/",methods=["GET","POST"]) 8.def getall(): 9. books = [ 10.(1,"java",20), 11.(2,"python",40), 12.(3,"linux",50) 13. ] 14.return jsonify(books) 15.# print("= "*30) 16.# for x in bpbooks.__dict__.items(): 17.# print(x)
修改/webapp/__init__.py文件如下:在app中註冊新建的藍圖文件
1.#/webapp/__init__.py 2.from flask import Flask,jsonify 3.from .books import bpbooks 4. 5.#創建應用 6..app = Flask("myweb") 7.#路由和視圖函數 [email protected]("/") 9.def index(): 10.return "hello flask" 11. [email protected]("/json",methods=["GET"]) #列表中指定多個方法 13.def getjson(): 14.d = {"a":1,"b":2,"c":3} 15.return jsonify(d) #Mime是application/json 16.# 註冊藍圖# 17.app.register_blueprint(bpbooks) 18.#如果在app中註冊藍圖時,給定了url_prefix,那麼藍圖內自定義的url_prefix將失效 19.app.register_blueprint(bpbooks,url_prefix="/bookss") 20.#打印重要屬性 21.print(*filter(lambda x: not x[0].startswith("__") and x[1],app.__dict__.items()),sep="\n") 22.print("- "*30) 23.print(app.url_map) 24.print(app.template_folder) 25.print(app.static_folder) 26.print("- "*30)
註冊完成後,啓動/main.py文件
Blueprint構造參數
name,藍圖名稱,註冊在app的藍圖字典中用的key
import_name,用來計算藍圖模塊所在路徑,一般寫__name__
root_path,指定藍圖模塊所在路徑,如果None,使用import_name計算得到
template_folder
url_prefix,指定本藍圖模塊的路徑前綴,app.register_blueprint註冊藍圖時,也可以對當前藍圖指定url_prefix,將覆蓋藍圖中的定義
特別注意,輸出的root_path路徑,說明藍圖有自己一套路徑。最後app.register_blueprint(bpbooks,url_prefix="/bookss"),url_prefix一定要以/開始,否則報錯,最後路徑以註冊的url_prefix爲準
模板
Flask使用jinja2模板。對於應用app來說其模板是,根目錄下的templates,其下新建index.html/templates/index.html文件內容如下
1.<!DOCTYPE html> 2.<html> 3.<head> 4.<meta charset="UTF-8"> 5.<title>xdd web</title> 6.</head> 7.<body> 8.<h2>歡迎使用flask框架</h2> 9.<hr> 10.{% for x in userlist %} 11.{{x}} 12.{% endfor %} 13.</body> 14.</html>
修改/webapp/__init__.py文件中的index視圖函數,使用模板渲染函數
1.from flask import Flask,jsonify,render_template 2. 3..#創建應用 4.app = Flask("myweb") 5. 6.#路由和視圖函數 [email protected]("/index.html") 8.def index(): 9.return render_template("index.html", userlist=[ 10. (1, "tom", 20), 11. (1, "json", 30), 12. ])
jinja2和Django模板語法一致,這裏不闡述在app.jinja_loader屬性中,有下面的語句
1.@locked_cached_property 2.def jinja_loader(self): 3. """The Jinja loader for this package bound object. 4. 5. .. versionadded:: 0.5 6. """ 7.if self.template_folder is not None: 8. return FileSystemLoader(os.path.join(self.root_path, self.template_folder))
說明:不管是app,還是bluepoint,都是使用自己的root_path和模板路徑拼接成模板路徑。
可以通過app或者bluepoint查看app.jinja_loader.searchpath模板搜索路徑。