Flask基础知识点1
一、.基于裝飾器的session訪問控制,endpoint路由參數可以解決視圖函數重名的情況。
下面我有一個簡單的需求,就是一個網站有三個頁面,分別是home、index和login界面,用戶只有當登陸后才可以正常訪問home和index頁面,通過裝飾器的方法來實現。接下來看代碼
from flask import Flask, request, render_template, redirect, Markup, sessionapp = Flask(__name__) app.secret_key = "abcdefghijklmn"def wrapper(f):def inner(*args, **kwargs):if session.get("user"):ret = f(*args, **kwargs)return retelse:return redirect("/login")return inner@app.route("/login", methods=("GET","POST")) def login():if request.method == "GET":return render_template("login.html")if request.method == "POST":username = request.form.get("username")session["user"] = usernamereturn "登陸成功"@app.route("/home", methods=("GET", "POST")) @wrapper def home():return "這是home界面的內容"@app.route("/index") def index():return "我是index界面的內容"app.run()當我們只對home視圖函數加上認證裝飾器時實現了我們的需求,但是如果你給index也加上認證裝飾器時你就會發現Flask項目啟動不起來了,會報一個這樣的錯誤:
image.png
這是因為,當我們對一個以上的視圖函數添加了認證裝飾器后 ,認證裝飾器會將視圖函數名替換成裝飾器的內層函數名inner,在內存中就會出現視圖函數名重復的情況,這樣Flask的路由裝飾器裝飾視圖函數時就會報錯,解決這個錯誤的方法就是給路由的endpoint參數指定視圖函數名,即:
from flask import Flask, request, render_template, redirect, Markup, sessionapp = Flask(__name__) app.secret_key = "abcdefghijklmn"def wrapper(f):def inner(*args, **kwargs):if session.get("user"):ret = f(*args, **kwargs)return retelse:return redirect("/login")return inner@app.route("/login", methods=("GET","POST")) def login():if request.method == "GET":return render_template("login.html")if request.method == "POST":username = request.form.get("username")session["user"] = usernamereturn "登陸成功"@app.route("/home",endpoint="home", methods=("GET", "POST")) @wrapper def home():return "這是home界面的內容"@app.route("/index",endpoint="index") @wrapper def index():return "我是index界面的內容"app.run()二、Flask中的路由參數
- @app.route()
常用動態路由參數有以下五種,所有的路由系統都是基于以下對應關系來處理:
DEFAULT_CONVERTERS = {'default': UnicodeConverter,'string': UnicodeConverter,'any': AnyConverter,'path': PathConverter,'int': IntegerConverter,'float': FloatConverter,'uuid': UUIDConverter, }url_for的用法
from flask import Flask,url_forapp = Flask(__name__)@app.route("/index/<int:age>",endpoint="index") def index(age):url = url_for("index",age = age)print(url) // "/index/122"return "我是index界面的內容"app.run()- app.add_url_rule()方法:比@app.route()多了一個 view_func=view_func參數,其他的相同。
三、Flask配置文件
1. 初始化Flask實例時的配置
app = Flask(_name_,template_folder="template",static_folder="static",static_url_path="/static")
- static_url_path = "/static_folder" 訪問靜態目錄文件時的地址 默認值是等于static_folder的名字,(應用場景描述:當后端static文件名修改后,加入前端頁面使用了大量的之前的static路徑,可以將static_url_path參數設置為老的,這樣就可以不用修改前端代碼了。)
- static_folder = "static" 靜態文件的存放路徑
- template_folder='templates' 模板路徑
2. Flask實例的配置 app配置
- 方式一、app.config["DEBUG"] = True
PS: 由于Config對象本質上是字典,所以還可以使用app.config.update(...) - 方式二、app.config.from_object(obj)
- 方式三、app.config.from_pyfile("settings.py")
settings.py
- 方式四、app.config.from_envvar("環境變量名稱")
PS:環境變量的值為python文件名稱名稱,內部調用from_pyfile方法 - 方式五、app.config.from_json("json文件名稱")
PS: JSON文件名稱,必須是json格式,因為內部會執行json.loads - 方式六、app.config.from_mapping({'DEBUG':True})
PS:字典格式
四、Flask的藍圖
藍圖”和一個Flask應用對象很相似,但是并不是一個Flask應用對象。它是可以注冊到Flask應用上的一系列操作(對于此的理解,后文會詳細講到)。使用“藍圖”,可以實現以下的一些功能:
- 將Flask應用“分割”為一系列“藍圖”的集合,簡化了大型應用工作的方式;
- 在Flask應用上,以 URL 前綴和或子域名注冊一個藍圖。可以以不同的URL多次注冊一個藍圖;
- 通過藍圖提供模板過濾器、靜態文件、模板和其它功能。
第一步:藍圖的創建(藍圖的示例和Flask的實例參數一樣)
add.py
第二步:注冊藍圖:
from flask import Flask import addapp = Flask(\__name__)app.register_blueprint(add.bp)if __name__ == '__main__':app.run()五、Flask里面的擴展,相當于django中的中間件
1.before_request 再請求進入視圖函數之前作出處理 return None;before_request是順序執行
2.after_request 在請求結束視圖函數之后,返回客戶端之前 ,要有參數和返回值,after_request是逆向執行
3.errorheadler(404) 自定制錯誤提示,自定義的函數必須有參數
- before_request和after_request裝飾器的使用
訪問login視圖函數后的控制臺輸出結果為:
process_request1 process_request2 process_response2 process_response1通過代碼的打印結果可以看出,before_request順序執行;after_request逆向執行
- errorhandler(404)的使用
六、閃現:flash
session存在在服務端的一個字典里面,session保存起來,取一次里面還是有的,直到你刪除之后才沒有了。
flash的本質:flash是基于session創建的,flash支持往里邊放值,只要你取一下就沒有了,相當于pop了一下。不僅吧值取走,而且吧session里的東西去掉。
flash的使用:get_flashed_messages()和flash("內容")
from flask import Flask,session,render_template,request,flash,get_flashed_messages import flask_configapp = Flask(__name__) @app.route("/index") def index():res = get_flashed_messages()if not res:res = [""]flash("你剛才訪問了index")return render_template("index.html",msg=res[0])@app.route("/home") def index1():res = get_flashed_messages()if not res:res = [""]flash("你剛才訪問了home")return render_template("index.html",msg=res[0])if __name__ == '__main__':app.run()七、Flask的send_file使用
from flask import Flask,send_fileapp = Flask(__name__)@app.route("/index", endpoint="index") def index():return send_file(file_path) //send_file()的作用是打開文件傳輸內容app.run()八、Flask的jsonify的使用
- json.dumps的作用是序列化數據
- jsonify的作用是將后端數據json序列化,打包一個 content-Type:application/json 返回給客戶端
總結
以上是生活随笔為你收集整理的Flask基础知识点1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: legend---十二、js中的js语句
- 下一篇: Thread源码分析之join方法