flask(二)

1.裝飾器坑

使用裝飾器後,視圖函數名字相同問題view function錯誤問題
    1.給裝飾器加functiontools
    2.反向生成url地址標誌,指定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)

 

啓動程序會報錯html

緣由json

 
 @outer  裝飾器返回的是inner,因此兩個加了 @outer裝飾器的函數都是inner,就會報錯

 

解決方案:flask

方式一: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 則能夠將原函數對象的指定屬性複製給包裝函數對象, 默認有 __module____name____doc__`

 

方式二:endpoint安全

反向生成url地址標誌 默認視圖函數名 服務器

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"] :只有列表中的訪問方式才能夠執行該視圖函數
2.endpoint="index" :反向url地址,默認爲視圖函數名
3.defaults={"nid"="123"}  :默認參數
4.strict_slashes=True(Flase)  :是否嚴格遵循路由地址規則,後面可不能夠加/
5.redirect_to="/index"  :永久重定向(一般用於網站永久更改地址)
6.int與string:以下圖,動態路由參數(視圖函數中要接受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")#靜態文件目錄
app=Flask(__name__,static_url_path="/static")#遇到/static時,找static_folder,靜態目錄和靜態文件路徑地址的區別
static_url_path默認是static_folder前加一個/
######################################3
4.static_host=None #指定靜態文件服務器地址
5.host_matching = False,  # 若是不是特別須要的話,慎用,不然全部的route 都須要host=""的參數,必須得有SERVER_NANME纔有用
6.instance_path = None,  # 指向另外一個Flask實例的路徑
7.instance_relative_config = False  # 是否加載另外一個實例的配置
8.root_path = None  # 主模塊所在的目錄的絕對路徑,默認項目目錄

 

4.flask對象配置

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

 

{
    'DEBUG': False,  # 是否開啓Debug模式,
    'TESTING': False,  # 是否開啓測試模式
    區別:DEBUG能夠重啓,TESTING不能夠重啓,TESTING在控制檯中能夠看到全部的信息
    
    'PROPAGATE_EXCEPTIONS': None,  # 是否開啓異常傳播(是否在控制檯打印LOG) 當Debug或者testing開啓後,自動爲True
    
    'PRESERVE_CONTEXT_ON_EXCEPTION': None,  # 一兩句話說不清楚,通常不用它
    
    'SECRET_KEY': None,  # 以前遇到過,在啓用flask內置Session(或開啓閃現時)的時候,必定要有它
    'PERMANENT_SESSION_LIFETIME': 31,  # days , Session的生命週期(天)默認31天
    
    'USE_X_SENDFILE': False,  # 是否棄用 x_sendfile
    'LOGGER_NAME': None,  # 日誌記錄器的名稱
    'LOGGER_HANDLER_POLICY': 'always',
    'SERVER_NAME': None,  # 服務訪問域名
    'APPLICATION_ROOT': None,  # 項目的完整路徑
    
    !!!!!!!!!!
    'SESSION_COOKIE_NAME': 'session',  # 在cookies中存放session加密字符串的名字
    
    'SESSION_COOKIE_DOMAIN': None,  # 在哪一個域名下會產生session記錄在cookies中
    'SESSION_COOKIE_PATH': None,  # cookies的路徑
    'SESSION_COOKIE_HTTPONLY': True,  # 控制 cookie 是否應被設置 httponly 的標誌,
    'SESSION_COOKIE_SECURE': False,  # 控制 cookie 是否應被設置安全標誌
    'SESSION_REFRESH_EACH_REQUEST': True,  # 這個標誌控制永久會話如何刷新
    'MAX_CONTENT_LENGTH': None,  # 若是設置爲字節數, Flask 會拒絕內容長度大於此值的請求進入,並返回一個 413 狀態碼
    'SEND_FILE_MAX_AGE_DEFAULT': 12,  # hours 默認緩存控制的最大期限
    'TRAP_BAD_REQUEST_ERRORS': False,
    # 若是這個值被設置爲 True ,Flask不會執行 HTTP 異常的錯誤處理,而是像對待其它異常同樣,
    # 經過異常棧讓它冒泡地拋出。這對於須要找出 HTTP 異常源頭的可怕調試情形是有用的。
    'TRAP_HTTP_EXCEPTIONS': False,
    # Werkzeug 處理請求中的特定數據的內部數據結構會拋出一樣也是「錯誤的請求」異常的特殊的 key errors 。
    # 一樣地,爲了保持一致,許多操做能夠顯式地拋出 BadRequest 異常。
    # 由於在調試中,你但願準確地找出異常的緣由,這個設置用於在這些情形下調試。
    # 若是這個值被設置爲 True ,你只會獲得常規的回溯。
    'EXPLAIN_TEMPLATE_LOADING': False,
    'PREFERRED_URL_SCHEME': 'http',  # 生成URL的時候若是沒有可用的 URL 模式話將使用這個值
    'JSON_AS_ASCII': True,
    # 默認狀況下 Flask 使用 ascii 編碼來序列化對象。若是這個值被設置爲 False ,
    # Flask不會將其編碼爲 ASCII,而且按原樣輸出,返回它的 unicode 字符串。
    # 好比 jsonfiy 會自動地採用 utf-8 來編碼它而後才進行傳輸。
    'JSON_SORT_KEYS': True,
    #默認狀況下 Flask 按照 JSON 對象的鍵的順序來序來序列化它。
    # 這樣作是爲了確保鍵的順序不會受到字典的哈希種子的影響,從而返回的值每次都是一致的,不會形成無用的額外 HTTP 緩存。
    # 你能夠經過修改這個配置的值來覆蓋默認的操做。但這是不被推薦的作法由於這個默認的行爲可能會給你在性能的代價上帶來改善。
    'JSONIFY_PRETTYPRINT_REGULAR': True,
    'JSONIFY_MIMETYPE': 'application/json',#根據jsonify來更改響應頭中的contentType
    'TEMPLATES_AUTO_RELOAD': None,
}

 

有意義cookie

 

三種模式下切換太麻煩,用一個類(對象)來控制session

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

 

5.flask藍圖(blueprint)至關於一個可插拔的app

編寫數據結構

 

導入app

 

訪問:192.168.177.130:5000/app01

url前綴

 

註冊時加url前綴也行

若是兩個不同,以註冊爲準

 

6.flask中的flash(閃現)

存進去,取出來就消失了

存與取

 

只執行一次get_dlashed_messages裏面全部的東西都沒了

 

7.特殊裝飾器(s4)

1.@app.before_request:相似於中間件

請求進入視圖函數以前執行

先登陸才能進入視圖函數

 

能夠有多個before_request

 

2.@app.after_request:在相應客戶端以前

 

二者的執行順序

 

 

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

出現錯誤時換個頁面,自動播放歌曲

@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>您訪問的頁面出現了異常</h1>
  <audio src="/static/goout.mp3" autoplay></audio>
</body>
</html>
相關文章
相關標籤/搜索