如何从一个简单的网络应用程序中注销。在 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的主要内容,如果未能解决你的问题,请参考以下文章