用烧杯Bottle.py会议(Bottle.py session with Beaker)

2019-07-04 15:09发布

第一次提问这里。

我目前正在挣扎于如何使用烧杯使用正确的瓶的微架构。 这里是有问题的程序:

#!/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)

如果你注意到了,我一直在呼吁app_session = app.request.environ.get('beaker.session')上的每个def块,只是它不会返回一个错误,如: TypeError: 'NoneType' object does not support item assignment - - 这似乎是Python并不承认变量是它的功能外(纠正我,如果我错了)。

而这里的问题:

  1. 我应该怎么做只有一个实例app_session = app.request.environ.get('beaker.session')因此它可以提供给每一个def块(我真的需要一个实例,因为它是要检查的同一会话和用过的)。
  2. 如果这是唯一的方法(这是丑陋的,虽然),那么我应该只是结合起来,需要一个会话只是这样我就可以实现的单一实例的所有路由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')

Answer 1:

使用beakerbottle的应用程序很容易。 首先,设置你的瓶的应用:

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)

有了这个地方,每次收到请求时,你的烧杯会议将作为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


文章来源: Bottle.py session with Beaker