flask(二)
使用裝飾器后,視圖函數(shù)名字相同問題view function錯誤問題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)?
啟動程序會報錯
原因:
@outer 裝飾器返回的是inner,所以兩個加了 @outer裝飾器的函數(shù)都是inner,就會報錯?
解決方案:
方式一: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ù)對象的指定屬性復(fù)制給包裝函數(shù)對象, 默認(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"] :只有列表中的訪問方式才可以執(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:如下圖,動態(tài)路由參數(shù)(視圖函數(shù)中要接受page)float:@app.route("/index/<float:post_id>) path:@app.route("/index/<path:path>)?
3.flask實例化配置
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時,找static_folder,靜態(tài)目錄和靜態(tài)文件路徑地址的區(qū)別 static_url_path默認(rèn)是static_folder前加一個/ ######################################3 4.static_host=None #指定靜態(tài)文件服務(wù)器地址 5.host_matching = False, # 如果不是特別需要的話,慎用,否則所有的route 都需要host=""的參數(shù),必須得有SERVER_NANME才有用 6.instance_path = None, # 指向另一個Flask實例的路徑 7.instance_relative_config = False # 是否加載另一個實例的配置 8.root_path = None # 主模塊所在的目錄的絕對路徑,默認(rèn)項目目錄?
4.flask對象配置
app.secret_key="shy" app.config["SECRET_KEY"]="shy" #也可以這樣配置SECRET_KEY?
{'DEBUG': False, # 是否開啟Debug模式,'TESTING': False, # 是否開啟測試模式 區(qū)別:DEBUG可以重啟,TESTING不可以重啟,TESTING在控制臺中可以看到所有的信息'PROPAGATE_EXCEPTIONS': None, # 是否開啟異常傳播(是否在控制臺打印LOG) 當(dāng)Debug或者testing開啟后,自動為True'PRESERVE_CONTEXT_ON_EXCEPTION': None, # 一兩句話說不清楚,一般不用它'SECRET_KEY': None, # 之前遇到過,在啟用flask內(nèi)置Session(或開啟閃現(xiàn)時)的時候,一定要有它'PERMANENT_SESSION_LIFETIME': 31, # days , Session的生命周期(天)默認(rèn)31天'USE_X_SENDFILE': False, # 是否棄用 x_sendfile'LOGGER_NAME': None, # 日志記錄器的名稱'LOGGER_HANDLER_POLICY': 'always','SERVER_NAME': None, # 服務(wù)訪問域名'APPLICATION_ROOT': None, # 項目的完整路徑 !!!!!!!!!!'SESSION_COOKIE_NAME': 'session', # 在cookies中存放session加密字符串的名字'SESSION_COOKIE_DOMAIN': None, # 在哪個域名下會產(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, # 這個標(biāo)志控制永久會話如何刷新'MAX_CONTENT_LENGTH': None, # 如果設(shè)置為字節(jié)數(shù), Flask 會拒絕內(nèi)容長度大于此值的請求進(jìn)入,并返回一個 413 狀態(tài)碼'SEND_FILE_MAX_AGE_DEFAULT': 12, # hours 默認(rèn)緩存控制的最大期限'TRAP_BAD_REQUEST_ERRORS': False,# 如果這個值被設(shè)置為 True ,Flask不會執(zhí)行 HTTP 異常的錯誤處理,而是像對待其它異常一樣,# 通過異常棧讓它冒泡地拋出。這對于需要找出 HTTP 異常源頭的可怕調(diào)試情形是有用的。'TRAP_HTTP_EXCEPTIONS': False,# Werkzeug 處理請求中的特定數(shù)據(jù)的內(nèi)部數(shù)據(jù)結(jié)構(gòu)會拋出同樣也是“錯誤的請求”異常的特殊的 key errors 。# 同樣地,為了保持一致,許多操作可以顯式地拋出 BadRequest 異常。# 因為在調(diào)試中,你希望準(zhǔn)確地找出異常的原因,這個設(shè)置用于在這些情形下調(diào)試。# 如果這個值被設(shè)置為 True ,你只會得到常規(guī)的回溯。'EXPLAIN_TEMPLATE_LOADING': False,'PREFERRED_URL_SCHEME': 'http', # 生成URL的時候如果沒有可用的 URL 模式話將使用這個值'JSON_AS_ASCII': True,# 默認(rèn)情況下 Flask 使用 ascii 編碼來序列化對象。如果這個值被設(shè)置為 False ,# Flask不會將其編碼為 ASCII,并且按原樣輸出,返回它的 unicode 字符串。# 比如 jsonfiy 會自動地采用 utf-8 來編碼它然后才進(jìn)行傳輸。'JSON_SORT_KEYS': True,#默認(rèn)情況下 Flask 按照 JSON 對象的鍵的順序來序來序列化它。# 這樣做是為了確保鍵的順序不會受到字典的哈希種子的影響,從而返回的值每次都是一致的,不會造成無用的額外 HTTP 緩存。# 你可以通過修改這個配置的值來覆蓋默認(rèn)的操作。但這是不被推薦的做法因為這個默認(rèn)的行為可能會給你在性能的代價上帶來改善。'JSONIFY_PRETTYPRINT_REGULAR': True,'JSONIFY_MIMETYPE': 'application/json',#根據(jù)jsonify來更改響應(yīng)頭中的contentType'TEMPLATES_AUTO_RELOAD': None, }?
有意義
?
三種模式下切換太麻煩,用一個類(對象)來控制
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)于一個可插拔的app
編寫
?
導(dǎo)入
?
訪問:192.168.177.130:5000/app01
url前綴
?
注冊時加url前綴也行
如果兩個不一樣,以注冊為準(zhǔn)
?
6.flask中的flash(閃現(xiàn))
存進(jìn)去,取出來就消失了
存與取
?
只執(zhí)行一次get_dlashed_messages里面所有的東西都沒了
?
7.特殊裝飾器(s4)
1.@app.before_request:類似于中間件
請求進(jìn)入視圖函數(shù)之前執(zhí)行
先登錄才能進(jìn)入視圖函數(shù)
?
可以有多個before_request
?
2.@app.after_request:在相應(yīng)客戶端之前
?
兩者的執(zhí)行順序
?
?
3.@app.errorhandler(404) #重定義錯誤頁面返回信息
出現(xiàn)錯誤時換個頁面,自動播放歌曲
@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>您訪問的頁面出現(xiàn)了異常</h1><audio src="/static/goout.mp3" autoplay></audio> </body> </html>?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/shanghongyun/p/10228779.html
總結(jié)
- 上一篇: 使用百度云服务器BCC搭建网站,过程记录
- 下一篇: redis 系列26 Cluster高可