这是第一次提问者.
我目前正在努力使用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)
Run Code Online (Sandbox Code Playgroud)
如果你注意到,我继续调用app_session = app.request.environ.get('beaker.session')每个def块,所以它不会返回如下错误:TypeError: 'NoneType' object does not support item assignment---似乎Python不能识别其函数之外的变量(如果我错了,请纠正我).
以下是问题:
app_session = app.request.environ.get('beaker.session')所以每个def块都可以使用它(我真的需要一个实例,因为它是要检查和使用的相同会话).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')
Run Code Online (Sandbox Code Playgroud)
lar*_*sks 23
beaker在您的bottle应用程序中使用很容易.首先,设置您的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)
Run Code Online (Sandbox Code Playgroud)
后来:
bottle.run(app=app)
Run Code Online (Sandbox Code Playgroud)
有了这个,每次收到请求时,您的Beaker会话都将以
request.environ['beaker_session'].为方便起见,我通常会这样做:
@hook('before_request')
def setup_request():
request.session = request.environ['beaker.session']
Run Code Online (Sandbox Code Playgroud)
这安排setup_request在处理任何请求之前运行; 我们正在使用bottle.request变量(参见前面的import语句),它是一个线程局部变量,包含有关当前请求的信息.从这一点开始,我可以随时提到request.session它,例如:
@route('/')
def index():
if 'something' in request.session:
return 'It worked!'
request.session['something'] = 1
Run Code Online (Sandbox Code Playgroud)