Flask基础知识点1
一、.基于裝飾器的session訪問控制,endpoint路由參數(shù)可以解決視圖函數(shù)重名的情況。
下面我有一個簡單的需求,就是一個網(wǎng)站有三個頁面,分別是home、index和login界面,用戶只有當?shù)顷懞蟛趴梢哉TL問home和index頁面,通過裝飾器的方法來實現(xiàn)。接下來看代碼
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界面的內(nèi)容"@app.route("/index") def index():return "我是index界面的內(nèi)容"app.run()當我們只對home視圖函數(shù)加上認證裝飾器時實現(xiàn)了我們的需求,但是如果你給index也加上認證裝飾器時你就會發(fā)現(xiàn)Flask項目啟動不起來了,會報一個這樣的錯誤:
image.png
這是因為,當我們對一個以上的視圖函數(shù)添加了認證裝飾器后 ,認證裝飾器會將視圖函數(shù)名替換成裝飾器的內(nèi)層函數(shù)名inner,在內(nèi)存中就會出現(xiàn)視圖函數(shù)名重復的情況,這樣Flask的路由裝飾器裝飾視圖函數(shù)時就會報錯,解決這個錯誤的方法就是給路由的endpoint參數(shù)指定視圖函數(shù)名,即:
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界面的內(nèi)容"@app.route("/index",endpoint="index") @wrapper def index():return "我是index界面的內(nèi)容"app.run()二、Flask中的路由參數(shù)
- @app.route()
常用動態(tài)路由參數(shù)有以下五種,所有的路由系統(tǒng)都是基于以下對應關(guān)系來處理:
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界面的內(nèi)容"app.run()- app.add_url_rule()方法:比@app.route()多了一個 view_func=view_func參數(shù),其他的相同。
三、Flask配置文件
1. 初始化Flask實例時的配置
app = Flask(_name_,template_folder="template",static_folder="static",static_url_path="/static")
- static_url_path = "/static_folder" 訪問靜態(tài)目錄文件時的地址 默認值是等于static_folder的名字,(應用場景描述:當后端static文件名修改后,加入前端頁面使用了大量的之前的static路徑,可以將static_url_path參數(shù)設置為老的,這樣就可以不用修改前端代碼了。)
- static_folder = "static" 靜態(tài)文件的存放路徑
- template_folder='templates' 模板路徑
2. Flask實例的配置 app配置
- 方式一、app.config["DEBUG"] = True
PS: 由于Config對象本質(zhì)上是字典,所以還可以使用app.config.update(...) - 方式二、app.config.from_object(obj)
- 方式三、app.config.from_pyfile("settings.py")
settings.py
- 方式四、app.config.from_envvar("環(huán)境變量名稱")
PS:環(huán)境變量的值為python文件名稱名稱,內(nèi)部調(diào)用from_pyfile方法 - 方式五、app.config.from_json("json文件名稱")
PS: JSON文件名稱,必須是json格式,因為內(nèi)部會執(zhí)行json.loads - 方式六、app.config.from_mapping({'DEBUG':True})
PS:字典格式
四、Flask的藍圖
藍圖”和一個Flask應用對象很相似,但是并不是一個Flask應用對象。它是可以注冊到Flask應用上的一系列操作(對于此的理解,后文會詳細講到)。使用“藍圖”,可以實現(xiàn)以下的一些功能:
- 將Flask應用“分割”為一系列“藍圖”的集合,簡化了大型應用工作的方式;
- 在Flask應用上,以 URL 前綴和或子域名注冊一個藍圖。可以以不同的URL多次注冊一個藍圖;
- 通過藍圖提供模板過濾器、靜態(tài)文件、模板和其它功能。
第一步:藍圖的創(chuàng)建(藍圖的示例和Flask的實例參數(shù)一樣)
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 再請求進入視圖函數(shù)之前作出處理 return None;before_request是順序執(zhí)行
2.after_request 在請求結(jié)束視圖函數(shù)之后,返回客戶端之前 ,要有參數(shù)和返回值,after_request是逆向執(zhí)行
3.errorheadler(404) 自定制錯誤提示,自定義的函數(shù)必須有參數(shù)
- before_request和after_request裝飾器的使用
訪問login視圖函數(shù)后的控制臺輸出結(jié)果為:
process_request1 process_request2 process_response2 process_response1通過代碼的打印結(jié)果可以看出,before_request順序執(zhí)行;after_request逆向執(zhí)行
- errorhandler(404)的使用
六、閃現(xiàn):flash
session存在在服務端的一個字典里面,session保存起來,取一次里面還是有的,直到你刪除之后才沒有了。
flash的本質(zhì):flash是基于session創(chuàng)建的,flash支持往里邊放值,只要你取一下就沒有了,相當于pop了一下。不僅吧值取走,而且吧session里的東西去掉。
flash的使用:get_flashed_messages()和flash("內(nèi)容")
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()的作用是打開文件傳輸內(nèi)容app.run()八、Flask的jsonify的使用
- json.dumps的作用是序列化數(shù)據(jù)
- jsonify的作用是將后端數(shù)據(jù)json序列化,打包一個 content-Type:application/json 返回給客戶端
總結(jié)
以上是生活随笔為你收集整理的Flask基础知识点1的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: legend---十二、js中的js语句
- 下一篇: Thread源码分析之join方法