首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与Beaker的Bottle.py会话

与Beaker的Bottle.py会话
EN

Stack Overflow用户
提问于 2012-12-06 01:05:40
回答 1查看 9.7K关注 0票数 5

第一次提问。

我目前正在挣扎如何正确地使用烧杯使用瓶子的微型框架。下面是一个有问题的程序:

代码语言:javascript
复制
#!/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 --它似乎不识别函数之外的变量(如果我错了,请纠正我)。

以下是一些问题:

  1. 我应该做些什么,才能只有一个app_session = app.request.environ.get('beaker.session')实例,这样每个def块都可以使用它(我真的需要一个实例,因为它是要检查和使用的同一个会话)。
  2. 如果这是唯一的方法(虽然很难看),那么我应该将所有需要会话的路由组合起来,这样我才能实现app_session的单个实例

类似于:

代码语言:javascript
复制
@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')
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-06 01:35:09

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

代码语言:javascript
复制
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)

后来:

代码语言:javascript
复制
bottle.run(app=app)

在此基础上,每次收到请求时,您的Beaker会话都将以request.environ['beaker_session']的形式提供。我通常这样做是为了方便:

代码语言:javascript
复制
@hook('before_request')
def setup_request():
    request.session = request.environ['beaker.session']

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

代码语言:javascript
复制
@route('/')
def index():
    if 'something' in request.session:
       return 'It worked!'

    request.session['something'] = 1
票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13735333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档