我要登录,谁在登录使用FLASK的应用。
我尝试使用
@app.before_request
但问题是我需要通过 flask globals 访问用户名,如果我使用这个装饰器,我什么也得不到。
此外,像下面这样使用全局变量也不起作用。如何在请求上下文中获取全局变量?
import logging
import time
from flask import request, flash
from flask import g
from forms import QueryForm, RequestForm, Approve_Reject_Btn_Form
from query.sqlQuery import SQLQuery
from database.oracle import Database
import datetime
from requests import Session
logger = logging.getLogger(__name__)
login_count = 0
'''
Homepage route - Displays all the tables in the homepage
'''
@app.route('/')
@app.route('/index')
def index():
try:
if not g.identity.is_authenticated():
return render_template('homepage.html')
else:
try:
global login_count
if login_count == 0:
username = g.identity.name
user_ip = request.headers.get('IP_header')
current_time = time.strftime('%c')
db = Database(db_config.username, db_config.password)
query = "INSERT INTO UserIP (username, login_time, ip_address) values ('%s', systimestamp, '%s')" % (username, user_ip)
dml_query(query)
logger.debug('User : %s, ip : %s, noted at time : %s, login_count : %s', username , user_ip, current_time, login_count)
login_count = 1
最佳答案
至于您的问题“如何在 flask 中只执行一次代码块?”去吧,这样的事情应该可以正常工作:
app = Flask(__name__)
@app.before_first_request
def do_something_only_once():
app.logger.setLevel(logging.INFO)
app.logger.info("Initialized Flask logger handler")
问题的第二部分是如何设置全局变量,例如示例中的登录计数器。对于这样的事情,我建议您使用外部缓存。请参阅下面的 werkzeug SimpleCache 类示例。在生产环境中,您应该将 SimpleCache 替换为 redis 或 mongodb。
from werkzeug.contrib.cache import SimpleCache
class Cache(object):
cache = SimpleCache(threshold = 1000, default_timeout = 3600)
@classmethod
def get(cls, key = None):
return cls.cache.get(key)
@classmethod
def delete(cls, key = None):
return cls.cache.delete(key)
@classmethod
def set(cls, key = None, value = None, timeout = 0):
if timeout:
return cls.cache.set(key, value, timeout = timeout)
else:
return cls.cache.set(key, value)
@classmethod
def clear(cls):
return cls.cache.clear()
你可以像这样使用缓存类。
from mycache import Cache
@app.route('/')
@app.route('/index')
def index():
if not g.identity.is_authenticated():
return render_template('homepage.html')
else:
login_count = Cache.get("login_count")
if login_count == 0:
# ...
# Your code
login_count += 1
Cache.set("login_count", login_count)
编辑 1:添加 after_request 示例
根据 Flask 文档,after_request 装饰器用于在每个请求后运行已注册的函数。它可用于使缓存无效、更改响应对象或几乎任何需要特定响应修改的操作。
@app.after_request
def after_request_callback(response):
# Do something with the response (invalidate cache, alter response object, etc)
return response
关于python - 如何在 flask 中只执行一次代码块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31259783/