Flask--路由, 配置, 藍圖

一 . 雙重裝飾器重名的解決辦法

# 咱們都知道flask中的@app.route就是一層裝飾器, 當咱們須要在給視圖函數加裝飾器的時候就兩層裝飾器,這裏介紹一下加裝飾器的前後順序,以及遇到的問題.

  1.咱們先定義一個裝飾器

def wrapper(func): def inner(*args, **kwargs): if session.get('is_login'): ret = func(*args, **kwargs) return ret else: return redirect('/login') return inner

  2.給視圖函數加上裝飾器

# Flask中的route裝飾器放到最外面, 它裝飾被操做完的視圖函數. # 凡是加上雙裝飾器的函數, @app.route()裏面都要寫endpoint='名字隨便起,可是不能重複', 不然會報下面這個錯誤.  # AssertionError: View function mapping is overwriting an existing endpoint function: inner  @app.route("/index", endpoint='index') @wrapper def index(): return 'Conguatulations!!!' @app.route('/static/detail', endpoint='detail') @wrapper def detail(): return render_template('detail.html', student_detail=STUDENT_DETAIL)

  報錯源碼

if view_func is not None: # view_func = def detail # view_func = def index old_func = self.view_functions.get(endpoint) # endpoint = "detail" if old_func is not None and old_func != view_func: raise AssertionError('View function mapping is overwriting an ' 'existing endpoint function: %s' % endpoint) self.view_functions[endpoint] = view_func # 若是都不寫endpoint的話,第一次view_func(detail)賦值給endpoint,   那麼第二次view_func(index)來的時候就已經有endpoint了,而且endpoint是detail,   明顯不爲空而且detail != index,因此報錯.  

二 . Flask路由

  1. 添加路由的方式

# 第一種,直接在裝飾器裏面寫 @app.route("/index") def index() # 第二種,方法,寫在函數下面 app.add_url_rule("/index",view_func=index)

  2.methods 

# methods要寫在@app.route()裏面, 並且methods=可迭代對象(列表,元組等),可迭代對象裏面寫http的8中請求方式. @app.route('/login', methods=['GET', 'POST'])

  3.endpoint

endpoint 路由Mapping 地址對應視圖函數,絕對不能重複 @app.route('/index',endpoint='隨便起名') def my_index(): print(url_for(endpoint='這個名要和上邊的同樣')) # 獲得的是 /index, url_for須要導入 return '我是index'

  4.下面這3個瞭解

# 這些參數都寫在@app.route()裏面 strict_slashes=True # 是否嚴格遵循路由匹配 -> "/"結尾 默認值是 True 必須嚴格遵循 defaults={"nid":3} # 默認路由參數 -> 視圖函數中必須有一個nid的形參接收,必須叫這個名 redirect_to="/index" # 永久重定向 -> 不進入試圖函數處理,直接跳轉

  5.動態參數路由(必須知道的)

@app.route("/detail/<stu_id>") 能夠在 路由地址 以後增長參數的傳遞 視圖函數中必須有一個 stu_id 的形參接收且必須叫這個名 例如: @app.route("/getimg/<path>/<filename>") def getimg(path,filename): file_path = os.path.join(path,filename) return send_file(file_path) # 在瀏覽器中輸入127.0.0.1:5000/getimg/img/1.jpg 就能訪問到本機上img文件夾下1.jpg這張圖片.

三 . Flask配置

  Flask初始化配置

# 如下這些都寫在app=Flask(__name__)裏面,如app=Flask(__name__,static_folder=img) 1.template_folder="tem" # 指定模板存放路徑,建立tem文件夾裝html文件,flask能找到路徑 2.static_folder="img" # 指定靜態文件的存放路徑,告訴flask去img裏面找 3.static_url_path="/static" #指定靜態文件訪問路徑,當你訪問static的時候去img裏面找 <img src="/static/1.jpg"> # 這時候找的就是img中的1.jpg # 源碼 # if static_url_path is None  # static_url_path = "/" + static_folder = /img static_host=None, 靜態文件的存放服務器 host_matching=False, False 主機位匹配 www.baidu.com:999 subdomain_matching=False, 遵循子域名匹配

  Flask對象配置

app.default_config # ctrl + 鼠標左鍵點default_config查看默認配置及配置項

  配置應用, 新建一個py文件

# mysetting.py文件 # debug環境下,裏面的屬性必須都大寫 class DebugSetting(object): DEBUG = True SECRET_KEY = "#$%^&*$%*&%*" SESSION_COOKIE_NAME = "我是session的名字" JSONIFY_MIMETYPE = "application/javascript" # 測試環境下,裏面的屬性必須都大寫 class TestingSetting(object): DEBUG = False TESTING = True SECRET_KEY = "我實際上是正式環境的賽克瑞特鑰匙" SESSION_COOKIE_NAME = "SHIT" JSONIFY_MIMETYPE = "application/json"

  在建一個py文件用於運行

# test.py文件 瀏覽其中訪問127.0.0.1:5000/index from flask import Flask, render_template, session app = Flask(__name__) # 從mysetting文件中導入 下面兩個類 from mysetting import DebugSetting from mysetting import TestingSetting # app.config.from_object(DebugSetting) # 開啓這個是debug環境 app.config.from_object(TestingSetting) # 開啓這個是測試環境 app.congfig.from_object(類名) 記住這個格式  @app.route("/index") def index(): session["key"] = "value" return render_template("index.html") if __name__ == '__main__': app.run()

四 . Flask藍圖

  Blueprint 就是藍圖, 能夠理解爲不能被run的Flask對象

  新建一個py文件

# message.py文件 from flask import Blueprint msg = Blueprint("msg",__name__,url_prefix="/xxx") # 第一個參數是藍圖標識,隨便寫,但不能重複, url_prefix是前綴,當你訪問msg的時候須要加上/xxx,    也就是說你正常訪問127.0.0.0:5000/msg變成了127.0.0.0:5000/xxx/msg  @msg.route("/msg",methods=['POST','GET']) def msg(): return "我是信息文件"

  再建一個py文件

# userinfo.py文件 from flask import Blueprint user = Blueprint("隨便寫",__name__) # url_prefix沒啥必要  @user.route("/user",methods=["GET","POST"]) def my_user(): return "i am user"

  建立一個能運行藍圖的文件

from flask import Flask from userinfo import user from message import msg app = Flask(__name__) app.register_blueprint(user) app.register_blueprint(msg) if __name__ == '__main__': app.run(debug=True) # 這是候訪問127.0.0.1:5000/user 返回結果就是i am user

 五 . 藍圖結構

  

  Blueprint藍圖都寫在views文件夾中

# 寫在views文件夾裏的bigboy.py文件 from flask import Blueprint boy = Blueprint('boy', __name__) @boy.route('/boy') def my_boy(): return '我是大帥鍋!'

  app01中__init__文件

from flask import Flask from app01.views import bigboy def create_app(): app = Flask(__name__) #須要註冊藍圖  app.register_blueprint(bigboy.boy) return app

  manage.py文件中數據

from app01 import create_app app = create_app() if __name__ == '__main__': app.run(debug=True)
相關文章
相關標籤/搜索