簡體   English   中英

無法在 python flask 中工作的 def function

[英]unable get def function working in python flask

我正在創建一個登錄系統,如果登錄的 session 為假,我想制作一個 function 將用戶重定向到登錄頁面。

from flask import Flask, render_template, redirect, url_for, request, session
import json
from db import database

def login_require():
    if session.get('islogin') != True:
        return redirect(url_for('login'))

app = Flask(__name__)
app.secret_key = 'secret key for session'

@app.route('/login')
def login():
    if session.get('islogin') == True:
        return redirect(url_for('index'))
    else:
        return render_template('login.html')

@app.route('/rishtedar')
def rishtedar():
    login_require()
    return render_template('rishtedar.html')

在上面的代碼中 function login_require() 不重定向到登錄頁面

def login_require():
    if session.get('islogin') != True:
        return redirect(url_for('login'))

@app.route('/rishtedar')
def rishtedar():
    login_require()
    return render_template('rishtedar.html')

login_require()中的return將值(在本例中為重定向響應)發送回您調用它的位置,但該行對返回值沒有任何作用。 相反,您的代碼會繼續調用render_template()並返回響應。

您需要找到一種方法來使用login_require()的返回值:

@app.route('/rishtedar')
def rishtedar():
    required = login_require()
    if required:
       return required
    return render_template('rishtedar.html')

此解決方案按原樣使用您的login_require() function。 另一種解決方案是將 function 傳遞給login_require() ,它會在成功時返回響應:

def login_require(get_response):
    if session.get('islogin'): # Never compare "== True" or "!= True"
        return get_response()
    return redirect(url_for('login'))

@app.route('/rishtedar')
def rishtedar():
    def get_response():
        return render_template('rishtedar.html')
    return login_require(get_response)

這個版本非常好,因為它開始了你的裝飾器之旅。 我建議您閱讀這些內容,因為它們提供了一種優雅的語法,可以方便地修改函數的行為,而無需大量重復。 一旦你理解了這個概念,你就可以創建一個類似於你已經使用的@app.route()裝飾器的@login_require裝飾器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM