Flask框架簡單使用

Flask框架簡單使用

快速構建

  1. 在項目根目錄下構建:
    • webapp包目錄,存放flask代碼,包內有__init__.py文件
    • templates目錄,存放模板文件
    • static目錄,存放js,css等靜態文件。其下建立js目錄,放入jquery、echarts的js文件
    • app.py入口文件
  • 基本組成
    1. 目錄結構如下:
      flask_001
# /webapp/__init__.py文件內容
from flask import Flask,jsonify

#創建應用
app = Flask("myweb")

#路由和視圖函數
@app.route("/")
def index():
    return "hello flask"

@app.route("/json",methods=["GET"]) #列表中指定多個方法
def getjson():
    d = {"a":1,"b":2,"c":3}
    return jsonify(d) #Mime是application/json

#打印重要屬性
print(*filter(lambda x: not x[0].startswith("__") and x[1],app.__dict__.items()),sep="\n")
print("- "*30)
print(app.url_map)
print(app.template_folder)
print(app.static_folder)
print("- "*30)
  1. 應用:創建出來提供WEB服務的實例,也是wsgi的入口
  2. 視圖函數:執行內部代碼輸出響應的內容
  3. 路由:通過route裝飾器創建path到視圖函數的映射關係
#/main.py文件
from webapp import app

if __name__ == "__main__":
    app.run("127.0.0.1",port=8080,debug=True)
  • 啓動main.py文件
    flack_002

藍圖

Flask中,基本上都是route裝飾器和視圖函數的映射,如果函數很多,代碼組織結構會非常亂。
藍圖Blueprint,就是Flask中模塊化技術

  • 新建/web/app/books.py藍圖文件
#/webapp/books.py文件

from flask import Blueprint,jsonify,render_template

bpbooks = Blueprint("booksapp",__name__,url_prefix="/books")
# bpbooks = Blueprint("booksapp",__name__)

@bpbooks.route("/",methods=["GET","POST"])
def getall():
    books = [
        (1,"java",20),
        (2,"python",40),
        (3,"linux",50)
    ]
    return jsonify(books)

# print("= "*30)
# for x in bpbooks.__dict__.items():
#     print(x)
  • 修改/webapp/__init__.py文件如下:在app中註冊新建的藍圖文件
#/webapp/__init__.py
from flask import Flask,jsonify
from .books import bpbooks

#創建應用
app = Flask("myweb")

#路由和視圖函數
@app.route("/")
def index():
    return "hello flask"

@app.route("/json",methods=["GET"]) #列表中指定多個方法
def getjson():
    d = {"a":1,"b":2,"c":3}
    return jsonify(d) #Mime是application/json

# 註冊藍圖
# app.register_blueprint(bpbooks)
#如果在app中註冊藍圖時,給定了url_prefix,那麼藍圖內自定義的url_prefix將失效
app.register_blueprint(bpbooks,url_prefix="/bookss")

#打印重要屬性
print(*filter(lambda x: not x[0].startswith("__") and x[1],app.__dict__.items()),sep="\n")
print("- "*30)
print(app.url_map)
print(app.template_folder)
print(app.static_folder)
print("- "*30)
  • 註冊完成後,啓動/main.py文件
  1. 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文件內容如下
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>xdd web</title>
</head>
<body>
<h2>歡迎使用flask框架</h2>
<hr>
{% for x in userlist  %}
{{x}}
{% endfor %}
</body>
</html>
  • 修改/webapp/__init__.py文件中的index視圖函數,使用模板渲染函數。
from flask import Flask,jsonify,render_template

#創建應用
app = Flask("myweb")

#路由和視圖函數
@app.route("/index.html")
def index():
    return render_template("index.html", userlist=[
        (1, "tom", 20),
        (1, "json", 30),
    ])
  • jinja2和Django模板語法一致,這裏不闡述

  • 在app.jinja_loader屬性中,有下面的語句

    @locked_cached_property
    def jinja_loader(self):
        """The Jinja loader for this package bound object.
    
        .. versionadded:: 0.5
        """
        if self.template_folder is not None:
            return FileSystemLoader(os.path.join(self.root_path, self.template_folder))
    
    1. 說明:不管是app,還是bluepoint,都是使用自己的root_path和模板路徑拼接成模板路徑。
    2. 可以通過app或者bluepoint查看app.jinja_loader.searchpath模板搜索路徑。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章