日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Flask基础知识点1

發布時間:2024/9/21 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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()
@app.route("/<age>" // 動態路由參數,默認是string,也可以是"/<int:age>"redirect_to = "/login" //不經過視圖函數直接重定向指定urldefaults = {"age": 999} //指定默認參數endpoint = "home" //路由別名,用于反向生成URL,即: url_for('名稱')methods = ("GET", "POST") //請求方式strict_slashes = False //是否嚴格匹配url最后的"/",例:http://127.0.0.1:5000/home 和 //http://127.0.0.1:5000/home/)

常用動態路由參數有以下五種,所有的路由系統都是基于以下對應關系來處理:

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)
class obj():DEBUG = TrueSECERT_KEY = "123123"
  • 方式三、app.config.from_pyfile("settings.py")
    settings.py
DEBUG = True SECERT_KEY = "123123"
  • 方式四、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 Blueprint,render_templatebp = Blueprint("bp", __name__,template_folder="blueprint_temp",static_folder="blueprint_static",static_url_path="/static2")@bp.route("/add") def add():return render_template("add.html")

第二步:注冊藍圖:

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裝飾器的使用
from flask import Flask, request, render_template, redirect, Markup, session, url_forapp = Flask(__name__) app.secret_key = "abcdefghijklmn"@app.before_request def process_request1():print('process_request1')@app.after_request def process_response1(response): # 必須有參數print('process_response1')return response # 必須有返回值@app.before_request def process_request2():print('process_request2')@app.after_request def process_response2(response): # 必須有參數print('process_response2')return response # 必須有返回值@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.run()

訪問login視圖函數后的控制臺輸出結果為:

process_request1 process_request2 process_response2 process_response1

通過代碼的打印結果可以看出,before_request順序執行;after_request逆向執行

  • errorhandler(404)的使用
@app.errorhandler(404) def errors(code_or_exception): //必須有參數return "錯誤" //可以返回字符串,html,重定向等

六、閃現: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 返回給客戶端
from flask import Flask, jsonifyapp = Flask(__name__)@app.route("/index", endpoint="index") def index():#return json.dumps({123:"34"}) //傳給前端的是json數據,僅此而已!return jsonify({123:"34"})) //序列化數據,將響應頭的content-Type: 更改為application/json app.run() 與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的Flask基础知识点1的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。