如何从一个简单的网络应用程序中注销。在 CherryPy,Python

Posted

技术标签:

【中文标题】如何从一个简单的网络应用程序中注销。在 CherryPy,Python【英文标题】:How to logout from a simple web appl. in CherryPy, Python 【发布时间】:2012-10-30 08:55:04 【问题描述】:

我不熟悉 CherryPy 和 Python,但我需要编写一个非常简单的 Web 应用程序来执行登录 ---> 执行一些命令 ---> 注销。对于登录,我使用以下链接中的代码:

http://tools.cherrypy.org/wiki/AuthenticationAndAccessRestrictions

申请是:

import cherrypy
import os.path
import struct
from auth import AuthController, require, member_of, name_is

class Server(object):
    led_power=0 
    led_switch=1 #Initial LED on

    _cp_config = 
        'tools.sessions.on': True,
        'tools.auth.on': True
       
    auth = AuthController()      
    @cherrypy.expose
    @require()
    def index(self,  switch='', power=''):
        if switch:
            self.led_switch = int(switch)
        if power:
            self.led_power = int(power)  

        html = open('led.html','r').read()

        if self.led_switch:
            print "ON"
        else:
            print "OFF"

        if self.led_power:
            print "Logout"
            cherrypy.session.clear()

        return html
    index.exposed = True


conf = 
    'global' :  
        'server.socket_host': '0.0.0.0', #0.0.0.0 or specific IP
        'server.socket_port': 8080 #server port
    ,

    '/images':  #images served as static files
        'tools.staticdir.on': True,
        'tools.staticdir.dir': os.path.abspath('images')
    ,

    '/favicon.ico':   #favorite icon
        'tools.staticfile.on': True,  
        'tools.staticfile.filename': os.path.abspath("images/bulb.ico")
    

cherrypy.quickstart(Server(), config=conf)

html文件是:

<html>
<head>
</head>
<body>
<br>
<a href="?switch=1"><img src="images/on.png"></a>
<a href="?switch=0"><img src="images/off.png"></a>
<p>
<a href="?power=1"><img src="images/Logout.png"></a>
</body>
</html>

一个文件夹包含三张图片。

当我运行应用程序时,我可以在 localhost 上看到带有用户名和密码字段的登录页面,然后我可以访问包含三个按钮“ON、OFF、Logout”的网页。

问题是我必须单击注销按钮两次才能注销,当我再次登录并单击任何按钮时,即使是打开或关闭按钮,页面也会注销并再次显示登录页面。 我无法以正确的方式注销,请帮忙?

谢谢

【问题讨论】:

【参考方案1】:

尝试运行此代码。它调用 AuthController().logout() 函数。

import cherrypy
import os.path
import struct
from auth import AuthController, require, member_of, name_is

class Server(object):
    led_power=0 
    led_switch=1 #Initial LED on

_cp_config = 
    'tools.sessions.on': True,
    'tools.auth.on': True
   
auth = AuthController()      
@cherrypy.expose
@require()
def index(self,  switch='', power=''):
    if switch:
        self.led_switch = int(switch)
    if power:
        self.led_power = int(power)  

    html = open('led.html','r').read()

    if self.led_switch:
        print "ON"
    else:
        print "OFF"

    if self.led_power:
        print "Logout"
        AuthController().logout()

        return html
    index.exposed = True


conf = 
    'global' :  
        'server.socket_host': '0.0.0.0', #0.0.0.0 or specific IP
        'server.socket_port': 8080 #server port
    ,

    '/images':  #images served as static files
        'tools.staticdir.on': True,
        'tools.staticdir.dir': os.path.abspath('images')
    ,

    '/favicon.ico':   #favorite icon
        'tools.staticfile.on': True,  
        'tools.staticfile.filename': os.path.abspath("images/bulb.ico")
    

cherrypy.quickstart(Server(), config=conf)

希望这会有所帮助。

安德鲁

【讨论】:

感谢 Andrew 的回复,但是当我点击注销按钮时,我得到了以下信息: 感谢 Andrew,但是当我单击注销按钮时,我得到以下信息:500 Internal Server Error 服务器遇到意外情况,无法满足请求。回溯(最后一次调用):文件“/usr/lib/pymodules/python2.7/cherrypy/_cprequest.py”,第 606 行,响应cherrypy.response.body = self.handler() 文件“/usr/lib /pymodules/python2.7/cherrypy/_cpdispatch.py​​",第 25 行,在 call 中 return self.callable(*self.args, **self.kwargs) 文件“run.py”,行33、in index auth.logout() NameError: global name 'auth' is not defined 我已经编辑了我的回复。试试 AuthController().logout()。希望这会有所帮助。 我刚刚尝试使用 AuthController().logout(),它现在是注销但我无法再次登录,即使我关闭该会话并打开一个新的,它总是要求我“输入登录信息”一!!!谢谢 hmmmm,你注销后重定向到什么网址?也许你会不断地去 /?power=1。如果是这种情况,请尝试 AuthController().logout('/?switch=1')。如果您仍有问题,请告诉我。

以上是关于如何从一个简单的网络应用程序中注销。在 CherryPy,Python的主要内容,如果未能解决你的问题,请参考以下文章

如何在注销期间取消所有 NSMutableURLRequest?

如何建立注销用户的路由并从mongodb数据库中删除

在 x 分钟不活动后以及从后台删除应用程序时注销用户

如何在整个会话中保留 JWT 令牌直到用户注销?

如何从应用程序而不是 Azure AD 中注销?

如果用户从 IdentityServer4 中的另一个浏览器/设备登录,如何检测并从应用程序中注销用户?