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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

flask(二)

發(fā)布時(shí)間:2023/12/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 flask(二) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.裝飾器坑

使用裝飾器后,視圖函數(shù)名字相同問(wèn)題view function錯(cuò)誤問(wèn)題1.給裝飾器加functiontools2.反向生成url地址標(biāo)志,指定endpoint(endpoint必須唯一)

?

from flask import Flask,session,request,redirect,render_template app = Flask(__name__) app.secret_key = 'lilz' ? def outer(func):def inner():print('success')func()# return 'ok'return inner ? @app.route('/') @outer def index():if not session.get('user'):return redirect('/login')return render_template('index.html') ? ? @app.route('/login',methods=['GET','POST']) @outer def login():if request.method == 'POST':if request.form.get('username') == 'lilz' and request.form.get('password'):session['user'] = request.form.get('username')+'666'return redirect('/')else:return render_template('login.html') ? ? app.run(debug=True)

?

啟動(dòng)程序會(huì)報(bào)錯(cuò)

原因

   @outer 裝飾器返回的是inner,所以?xún)蓚€(gè)加了 @outer裝飾器的函數(shù)都是inner,就會(huì)報(bào)錯(cuò)

?

解決方案:

方式一:functools

import functools from flask import Flask,session,request,redirect,render_template app = Flask(__name__) app.secret_key = 'lilz' ? #-------自定義裝飾器--------------------------------- def outer(func):@functools.wraps(func)def inner():print('success')func()# return 'ok'return inner ? @app.route('/') @outer def index():if not session.get('user'):return redirect('/login')return render_template('index.html') ? ? @app.route('/login',methods=['GET','POST']) @outer def login():if request.method == 'POST':if request.form.get('username') == 'lilz' and request.form.get('password'):session['user'] = request.form.get('username')+'666'return redirect('/')else:return render_template('login.html') ? app.run(debug=True)

?

`functools.wraps 則可以將原函數(shù)對(duì)象的指定屬性復(fù)制給包裝函數(shù)對(duì)象, 默認(rèn)有 __module____name____doc__`

?

方式二:endpoint

反向生成url地址標(biāo)志 默認(rèn)視圖函數(shù)名

from flask import Flask,session,request,redirect,render_template,url_for app = Flask(__name__) app.secret_key = 'lilz' ? ? def outer(func):def inner():print('success')func()return 'ok'return inner ? ? ? @app.route('/', endpoint="index") @outer def index():if not session.get('user'):return redirect('/login')return render_template('index.html') ? ? @app.route('/login',methods=['GET','POST'],endpoint="login") @outer def login():return 'enen' ? app.run(debug=True)

?

2.flask中的路由

@app.route("/") 1.methods=["GET","POST"] :只有列表中的訪(fǎng)問(wèn)方式才可以執(zhí)行該視圖函數(shù) 2.endpoint="index" :反向url地址,默認(rèn)為視圖函數(shù)名 3.defaults={"nid"="123"} :默認(rèn)參數(shù) 4.strict_slashes=True(Flase) :是否嚴(yán)格遵循路由地址規(guī)則,后面可不可以加/ 5.redirect_to="/index" :永久重定向(通常用于網(wǎng)站永久更改地址) 6.int與string:如下圖,動(dòng)態(tài)路由參數(shù)(視圖函數(shù)中要接受page)float:@app.route("/index/<float:post_id>) path:@app.route("/index/<path:path>)

?

3.flask實(shí)例化配置

app=Flask(__name__) ? 1.app=Flask(__name__,template_folder="temp")#指定模板路徑 2.app=Flask(__name__,static_folder="statics")#靜態(tài)文件目錄 app=Flask(__name__,static_url_path="/static")#遇到/static時(shí),找static_folder,靜態(tài)目錄和靜態(tài)文件路徑地址的區(qū)別 static_url_path默認(rèn)是static_folder前加一個(gè)/ ######################################3 4.static_host=None #指定靜態(tài)文件服務(wù)器地址 5.host_matching = False, # 如果不是特別需要的話(huà),慎用,否則所有的route 都需要host=""的參數(shù),必須得有SERVER_NANME才有用 6.instance_path = None, # 指向另一個(gè)Flask實(shí)例的路徑 7.instance_relative_config = False # 是否加載另一個(gè)實(shí)例的配置 8.root_path = None # 主模塊所在的目錄的絕對(duì)路徑,默認(rèn)項(xiàng)目目錄

?

4.flask對(duì)象配置

app.secret_key="shy" app.config["SECRET_KEY"]="shy" #也可以這樣配置SECRET_KEY

?

{'DEBUG': False, # 是否開(kāi)啟Debug模式,'TESTING': False, # 是否開(kāi)啟測(cè)試模式 區(qū)別:DEBUG可以重啟,TESTING不可以重啟,TESTING在控制臺(tái)中可以看到所有的信息'PROPAGATE_EXCEPTIONS': None, # 是否開(kāi)啟異常傳播(是否在控制臺(tái)打印LOG) 當(dāng)Debug或者testing開(kāi)啟后,自動(dòng)為T(mén)rue'PRESERVE_CONTEXT_ON_EXCEPTION': None, # 一兩句話(huà)說(shuō)不清楚,一般不用它'SECRET_KEY': None, # 之前遇到過(guò),在啟用flask內(nèi)置Session(或開(kāi)啟閃現(xiàn)時(shí))的時(shí)候,一定要有它'PERMANENT_SESSION_LIFETIME': 31, # days , Session的生命周期(天)默認(rèn)31天'USE_X_SENDFILE': False, # 是否棄用 x_sendfile'LOGGER_NAME': None, # 日志記錄器的名稱(chēng)'LOGGER_HANDLER_POLICY': 'always','SERVER_NAME': None, # 服務(wù)訪(fǎng)問(wèn)域名'APPLICATION_ROOT': None, # 項(xiàng)目的完整路徑 !!!!!!!!!!'SESSION_COOKIE_NAME': 'session', # 在cookies中存放session加密字符串的名字'SESSION_COOKIE_DOMAIN': None, # 在哪個(gè)域名下會(huì)產(chǎn)生session記錄在cookies中'SESSION_COOKIE_PATH': None, # cookies的路徑'SESSION_COOKIE_HTTPONLY': True, # 控制 cookie 是否應(yīng)被設(shè)置 httponly 的標(biāo)志,'SESSION_COOKIE_SECURE': False, # 控制 cookie 是否應(yīng)被設(shè)置安全標(biāo)志'SESSION_REFRESH_EACH_REQUEST': True, # 這個(gè)標(biāo)志控制永久會(huì)話(huà)如何刷新'MAX_CONTENT_LENGTH': None, # 如果設(shè)置為字節(jié)數(shù), Flask 會(huì)拒絕內(nèi)容長(zhǎng)度大于此值的請(qǐng)求進(jìn)入,并返回一個(gè) 413 狀態(tài)碼'SEND_FILE_MAX_AGE_DEFAULT': 12, # hours 默認(rèn)緩存控制的最大期限'TRAP_BAD_REQUEST_ERRORS': False,# 如果這個(gè)值被設(shè)置為 True ,Flask不會(huì)執(zhí)行 HTTP 異常的錯(cuò)誤處理,而是像對(duì)待其它異常一樣,# 通過(guò)異常棧讓它冒泡地拋出。這對(duì)于需要找出 HTTP 異常源頭的可怕調(diào)試情形是有用的。'TRAP_HTTP_EXCEPTIONS': False,# Werkzeug 處理請(qǐng)求中的特定數(shù)據(jù)的內(nèi)部數(shù)據(jù)結(jié)構(gòu)會(huì)拋出同樣也是“錯(cuò)誤的請(qǐng)求”異常的特殊的 key errors 。# 同樣地,為了保持一致,許多操作可以顯式地拋出 BadRequest 異常。# 因?yàn)樵谡{(diào)試中,你希望準(zhǔn)確地找出異常的原因,這個(gè)設(shè)置用于在這些情形下調(diào)試。# 如果這個(gè)值被設(shè)置為 True ,你只會(huì)得到常規(guī)的回溯。'EXPLAIN_TEMPLATE_LOADING': False,'PREFERRED_URL_SCHEME': 'http', # 生成URL的時(shí)候如果沒(méi)有可用的 URL 模式話(huà)將使用這個(gè)值'JSON_AS_ASCII': True,# 默認(rèn)情況下 Flask 使用 ascii 編碼來(lái)序列化對(duì)象。如果這個(gè)值被設(shè)置為 False ,# Flask不會(huì)將其編碼為 ASCII,并且按原樣輸出,返回它的 unicode 字符串。# 比如 jsonfiy 會(huì)自動(dòng)地采用 utf-8 來(lái)編碼它然后才進(jìn)行傳輸。'JSON_SORT_KEYS': True,#默認(rèn)情況下 Flask 按照 JSON 對(duì)象的鍵的順序來(lái)序來(lái)序列化它。# 這樣做是為了確保鍵的順序不會(huì)受到字典的哈希種子的影響,從而返回的值每次都是一致的,不會(huì)造成無(wú)用的額外 HTTP 緩存。# 你可以通過(guò)修改這個(gè)配置的值來(lái)覆蓋默認(rèn)的操作。但這是不被推薦的做法因?yàn)檫@個(gè)默認(rèn)的行為可能會(huì)給你在性能的代價(jià)上帶來(lái)改善。'JSONIFY_PRETTYPRINT_REGULAR': True,'JSONIFY_MIMETYPE': 'application/json',#根據(jù)jsonify來(lái)更改響應(yīng)頭中的contentType'TEMPLATES_AUTO_RELOAD': None, }

?

有意義

?

三種模式下切換太麻煩,用一個(gè)類(lèi)(對(duì)象)來(lái)控制

class FlaskDebug(object):DEBUG=TrueSECRET_KEY="DEBUGmoshidesecret_key"PERMANENT_SESSION_LIFETIME = 7SESSION_COOKIE_NAME = "debug_session" ? class FlaskTesting(object):TESTING=TrueSECRET_KEY="TESTINGmoshidesecret_key"PERMANENT_SESSION_LIFETIME = 15SESSION_COOKIE_NAME = "TESTING_session"

?

5.flask藍(lán)圖(blueprint)相當(dāng)于一個(gè)可插拔的app

編寫(xiě)

?

導(dǎo)入

?

訪(fǎng)問(wèn):192.168.177.130:5000/app01

url前綴

?

注冊(cè)時(shí)加url前綴也行

如果兩個(gè)不一樣,以注冊(cè)為準(zhǔn)

?

6.flask中的flash(閃現(xiàn))

存進(jìn)去,取出來(lái)就消失了

存與取

?

只執(zhí)行一次get_dlashed_messages里面所有的東西都沒(méi)了

?

7.特殊裝飾器(s4)

1.@app.before_request:類(lèi)似于中間件

請(qǐng)求進(jìn)入視圖函數(shù)之前執(zhí)行

先登錄才能進(jìn)入視圖函數(shù)

?

可以有多個(gè)before_request

?

2.@app.after_request:在相應(yīng)客戶(hù)端之前

?

兩者的執(zhí)行順序

?

?

3.@app.errorhandler(404) #重定義錯(cuò)誤頁(yè)面返回信息

出現(xiàn)錯(cuò)誤時(shí)換個(gè)頁(yè)面,自動(dòng)播放歌曲

@app.errorhandler(404) def error404(args):print(args)return render_template("error.html")

?

<!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><title>Title</title><meta name="viewport" content="width=device-width, initial-scale=1"> </head> <body><h1>您訪(fǎng)問(wèn)的頁(yè)面出現(xiàn)了異常</h1><audio src="/static/goout.mp3" autoplay></audio> </body> </html>

?

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/shanghongyun/p/10228779.html

總結(jié)

以上是生活随笔為你收集整理的flask(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。