gpt4 book ai didi

python - Bottle.py 与 Beaker 的 session

转载 作者:太空狗 更新时间:2023-10-30 00:21:24 29 4
gpt4 key购买 nike

这里是第一次提问。

我目前正在努力研究如何使用 Bottle 微框架正确使用 Beaker。这是有问题的程序:

#!/usr/bin/python
# -*- coding: utf-8 -*-
# filename: server.py

import bottle as app
from beaker.middleware import SessionMiddleware

session_options = {
'session.type': 'file',
'session.data_dir': './session/',
'session.auto': True,
}
app_middlware = SessionMiddleware(app.app(), session_options)
app_session = app.request.environ.get('beaker.session')

@app.route('/login')
def login():
app_session = app.request.environ.get('beaker.session')
app_session['logged_in'] = True

@app.route('/logout')
def logout():
app_session = app.request.environ.get('beaker.session')
if app_session.get('logged_in'):
app_session['logged_in'] = False
return 'You are logged out'
app.redirect('/login')

@app.route('/dashboard')
def dashboard():
app_session = app.request.environ.get('beaker.session')
if app_session.get('logged_in'):
return 'You are logged in'
app.redirect('/login')

app.debug(True)
app.run(app=app_middlware, reloader=True)

如果你注意到了,我会继续在每个 def block 上调用 app_session = app.request.environ.get('beaker.session') 所以它不会返回如下错误:TypeError: 'NoneType' object does not support item assignment --- 似乎 Python 无法识别其函数之外的变量(如果我错了请纠正我)。

下面是问题:

  1. 我应该怎么做才能只有一个 app_session = app.request.environ.get('beaker.session') 实例,这样它就可以用于每个 def block (我真的需要一个实例,因为它是要检查和使用的同一个 session )。
  2. 如果这是唯一的方法(尽管它很丑陋),那么我是否应该只组合所有需要 session 的路由,以便实现 app_session 的单个实例?

类似于:

@app.route('/<path:re:(login|dashboard|logout)\/?>')
def url(path):
app_session = app.request.environ.get('beaker.session')
if 'login' in path:
app_session['logged_in'] = True
elif 'logout' in path:
if app_session.get('logged_in'):
# app_session.delete() it doesn't seem to work?
app_session['logged_in'] = False
return 'You are logged out'
app.redirect('/login')
elif 'dashboard' in path:
if app_session.get('logged_in'):
return 'You are logged in'
app.redirect('/login')

最佳答案

在您的bottle 应用程序中使用beaker 很容易。首先,设置您的 Bottle 应用:

import bottle
from bottle import request, route, hook
import beaker.middleware

session_opts = {
'session.type': 'file',
'session.data_dir': './session/',
'session.auto': True,
}

app = beaker.middleware.SessionMiddleware(bottle.app(), session_opts)

随后:

bottle.run(app=app)

有了这个,每次您收到请求时,您的 Beaker session 将作为request.environ['beaker_session']。为了方便起见,我通常会这样做:

@hook('before_request')
def setup_request():
request.session = request.environ['beaker.session']

这安排在处理任何请求之前运行 setup_request;我们正在使用 bottle.request 变量(参见前面的 import 语句),它是一个线程局部变量,包含有关当前请求的信息。从这一点开始,我可以在需要时随时引用 request.session,例如:

@route('/')
def index():
if 'something' in request.session:
return 'It worked!'

request.session['something'] = 1

关于python - Bottle.py 与 Beaker 的 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13735333/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com