我有一个CherryPy服务器,它分配了一些静态HTML / JS /等。文件到/ foosball,加上一些JSON通过REST API到/.
import cherrypy
config = {
'global': {
'server.socket_host': '0.0.0.0',
'server.socket_port': # my port here,
'tools.json_in.on': True
},
'/foosball': {
'tools.staticdir.on': True,
'tools.staticdir.root': '/var/www/html',
'tools.staticdir.dir': 'foosball',
'tools.staticdir.index': 'index.html'
}
}
@cherrypy.popargs('player_id')
class RESTClient_Player(object):
# stuff
class RESTClient_Game(object):
# stuff
class RESTClient:
players = RESTClient_Player()
games = RESTClient_Game()
@cherrypy.expose
def index(self):
http_method = getattr(self, cherrypy.request.method)
return (http_method)()
cherrypy.quickstart(RESTClient(), '/', config)
我还希望通过基本访问限制方案保护这些页面,因此我一直在研究the excellent tutorial CherryPy provides。
麻烦的是,该文档适用于验证非静态页面,即def
语句明确声明的类型。我试过并且没有使这个文档适应/ foosball中的文件,但没有成功。 / foosball总是在没有任何身份验证请求的情况下加载。
我可以添加什么来为静态文件提供一些访问限制功能?
谢谢!
编辑:我指向了auth_tool。使用下面的配置块,我能够通过登录屏幕锁定REST API部分,但/ foosball中的所有静态文件仍然可以公开访问:
def check_login_and_password(login, password):
cherrypy.log(login)
cherrypy.log(password)
return
config = {
'global': {
'server.socket_host': '0.0.0.0',
'server.socket_port': # my port here,
'tools.json_in.on': True,
'tools.sessions.on': True,
'tools.session_auth.on': True,
'tools.session_auth.check_username_and_password': check_login_and_password
},
'/foosball': {
'tools.staticdir.on': True,
'tools.staticdir.root': '/var/www/html',
'tools.staticdir.dir': 'foosball',
'tools.staticdir.index': 'index.html',
'tools.sessions.on': True,
'tools.session_auth.on': True,
'tools.session_auth.check_username_and_password': check_login_and_password
}
}
答案 0 :(得分:1)
您可以在类中创建一个返回静态文件的函数,而不是在配置中使用“staticdir”。如果这样做,您可以围绕您的功能进行身份验证。
import cherrypy
from cherrypy.lib.static import serve_file
import os
class Hello(object):
@cherrypy.expose
def index(self):
return "Hello World"
@cherrypy.expose
def static(self, page):
return serve_file(os.path.join(current_dir, 'static', page), content_type='text/html')
if __name__ == '__main__':
current_dir = os.path.dirname(os.path.abspath(__file__))
cherrypy.quickstart(Hello())