Flask之視圖函數

視圖示例

@app.route('/hello')
def hello():
    return 'Hello World'

if __name__ == '__main__':
    app.run()

特殊的裝飾器

1. before_request   # 在全部視圖函數執行前執行

2. after_request  # 在全部視圖函數執行後執行

    示例:
        from flask import Flask
        app = Flask(__name__)


        @app.before_request
        def x1():
            print('before:x1')
            return '滾'

        @app.before_request
        def xx1():
            print('before:xx1')


        @app.after_request
        def x2(response):
            print('after:x2')
            return response

        @app.after_request
        def xx2(response):
            print('after:xx2')
            return response



        @app.route('/index')
        def index():
            print('index')
            return "Index"


        @app.route('/order')
        def order():
            print('order')
            return "order"


        if __name__ == '__main__':

            app.run()

3. before_first_request    # 在視圖函數第一次執行以前執行,只執行一次

    from flask import Flask
    app = Flask(__name__)

    @app.before_first_request
    def x1():
        print('123123')


    @app.route('/index')
    def index():
        print('index')
        return "Index"


    @app.route('/order')
    def order():
        print('order')
        return "order"


    if __name__ == '__main__':

        app.run()


4. template_global    # 定義全局的函數  能夠被任意模板調用

5. template_filter    # 定義一個模板filter

6. errorhandler      # 頁面錯誤的時候會執行此函數
    @app.errorhandler(404)
    def not_found(arg):
        print(arg)
        return "沒找到"

給視圖函數加裝飾器的注意事項

若是按照正常的寫法直接在視圖函數上加裝飾器@wrapper,則會報錯,這是由於加完裝飾器以後,原函數名就改變了。html

報錯信息:python

 AssertionError: View function mapping is overwriting an existing endpoint function: inner
 

在@app.route的狀況下增長裝飾器的寫法:django

from flask import Flask,request,render_template,redirect,session,url_for,views
from flask import render_template

app = Flask(__name__) #實例化flask對象
app.debug = True   #可以隨時更改自動重啓,不加的話每次更改代碼須要手動重啓
app.config['SECRET_KEY'] = '123456'   #secret_key,用於給session加密



@app.route('/login',methods=['GET','POST'],endpoint='t1') #endpoint是url的別名,至關於django中Url的name
def login():
    if request.method == "GET":
        # res = request.query_string
        # print(res)  獲取經過GET請求url傳過來的參數
        return render_template('login.html')
    else:
        user = request.form.get('user')
        pwd = request.form.get('pwd')
        if user == 'tom' and pwd == '123':
            session['userinfo'] = user   #設置session
            return render_template('hello.html')
        return render_template('login.html', error='用戶名或密碼錯誤')

def wapper(func):
    def inner(*args,**kwargs):
        user = session.get('user_info')
        if not user:
            return redirect('/login')
        return func(*args,**kwargs)
    return inner


@app.route('/detail/<int:nid>',methods=['GET'],endpoint='n1')
@wapper
def detail(nid):
    print(nid)
    return render_template('hello.html')
'''
若是給一個視圖函數增長裝飾器,應該加在app.route下面,這樣的效果就是,
裝飾器將下面的全部內容包裹,而後路由對應到這大的包裹中來。
須要注意endpoint要註明,若是不註明endpoint則默認用函數名來定義,
此時全部的函數名都叫inner了,因此須要註明endpoint,只是爲了區分。
'''

if __name__ == '__main__':
    app.run()

  

另外一種寫法:flask

import functools
def wapper(func):
    @functools.wraps(func)
    def inner(*args,**kwargs):
        return func(*args,**kwargs)
    return inner
'''
functools.wraps()至關於保留元信息
說白了就是,若是不加這個裝飾器,那麼你打印detail的__name__它就是inner了,
由於加了裝飾器,效果等同於inner=inner(detail()),
若是在裝飾器中加了functools這個裝飾器,那麼至關於給__name__從新賦值,inner.__name__ = func.__name_-
其函數的名字得以保留。
'''

@wapper
def detail():
    pass

print(detail.__name__)

  

flask的get_flashed_messages,flashsession

from flask import Flask,get_flashed_messages,flash
app = Flask(__name__)
app.secret_key = 'asdf'
@app.route('/get')
def get():
    data = get_flashed_messages()
    print(data)
    return 'Hello world'

@app.route('/set')
def set():
    flash('info info')
    '''
    閃現效果,至關於set視圖函數執行2次,會在一個列表中存儲兩個flash函數的內容,
    當執行get_flashed_messages的時候則會取出該列表,並清空,相似字典的Pop。
    具體用處不大。。。
    '''
    return 'Hello world'

if __name__ == '__main__':
    app.run()

  

flash還能夠經過category參數給Flash內容歸類,經過不一樣類別取不一樣內容。app

相關文章
相關標籤/搜索