配置
CherryPy具有更细致的配置机制,可以在各个层次设置不同的配置
全局服务器配置
要配置HTTP和应用程序服务器, 请使用cherrypy.config.update() 方法。
cherrypy.config.update({'server.socket_port': 9090})
该cherrypy.config对象是一个字典,update方法将传入的字典合并到其中
你也可以传递一个文件(假设一个server.conf文件):
server.socket_port: 9090
cherrypy.config.update("server.conf")
警告
cherrypy.config.update() 不是用于配置应用程序。这是一个常见的错误。 他用于配置服务器和引擎。
单独应用程序配置
要配置单独的应用程序, 在应用程序与服务器关联时,传入配置字典或文件。
cherrypy.quickstart(myapp, '/', {'/': {'tools.gzip.on': True}})
或通过文件(例如文件app.conf)
tool.gzip.on: True
cherrypy.quickstart(myaoo, '/', 'app.conf')
可以以全局的方式定义大部分配置,但是有必要在代码中定义应用程序的位置。
class Root(object):
@cherrypy.expose
@cherrypy.tools.gzip()
def index(self):
return "hello world!"
上面示例的不同写法:
class Root(object):
@cherrypy.expose
def index(self):
return "hello world!"
index._cp_config = {'tools.gzip.on': True}
额外的应用程序设置
你可以添加不特定于某个URL的配置, 并从处理程序中索引他们,如下所示
tools.gzip.on: True
key = "..."
appid = "..."
class Root(object):
@cherrypy.expose
def index(self):
google_appid = cherrypy.request.app.config['googleapi']['appid']
return "hello world!"
cherrypy.quickstart(Root(), '/', "app.conf")
Cookies
CherryPy使用Python模块 Cookie,Cookie.SimpleCookie对象来处理cookie
要将cookie发送至浏览器, 使用 cherrypy.response.cookie[key] = value
要提取浏览器的cookie, 使用 cherrypy.request.cookie[key]
要删除cookie(在客户端), 必须将cookie的过期时间设置为0:
cherrypy.response.cookie[key] =value
cherrypy.response.cookie[key]['expires'] = 0
因此每次都要设置cherrypy.request.cookie。但服务器不需要每次响应都发送相同的cookie;因此,
cherrypy.response.cookie通常是空的。所以,当你希望“删除”(到期)Cookie时,必须先设置 cherrypy.response.cookie[key] = value,
然后将其 expires 属性设置为0。
示例:
import cherrypy
class MyCookieApp(object):
@cherrypy.expose
def set(self):
cookie = cherrypy.response.cookie
cookie['cookieName'] = 'cookieValue'
cookie['cookieName']['path'] = '/'
cookie['cookieName']['max-age'] = 3600
cookie['cookieName']['version'] = 1
return "<html><body>Hello, I just sent you a cookie</body></html>"
@cherrypy.expose
def read(self):
cookie = cherrypy.request.cookie
res = """<html><body>Hi, you sent me %s cookies.<br />
Here is a list of cookie names/values:<br />""" % len(cookie)
for name in cookie.keys():
res += "name: %s, value: %s<br>" % (name, cookie[name].value)
return res + "</body></html>"
if __name__ == '__main__':
cherrypy.quickstart(MyCookieApp(), '/cookie')
使用 sessions
sessions是开发人员用来识别用户并同步其活动的常用机制之一。默认情况下,CherryPy不会激活sessions,
因为他不是必须的功能,要开启需要在配置中添加以下设置:
tools.sessions.on: True
cherrypy.quickstart(myapp, '/', "app.conf")
默认情况下,sessions储存在RAM中,因此,如果重启服务器,会丢失当前所有sessions。你可以将他们储存
在memcached或文件系统中。
如下示例,在应用程序中使用sessions:
import cherrypy
@cherrypy.expose
def index(self):
if 'count' not in cherrypy.session:
cherrypy.session['count'] = 0
cherrypy.session['count'] += 1
在这段代码中,每次调用索引页面,当前用户的sessions都会有一个“count”键增加1.
CherryPy通过检查请求中发送的cookie,知道要使用哪一个sessions
文件系统后端
使用文件系统很简单,在重新启动时不会丢失sessions。每个sessions都保存在给定目录中的文件中
tools.sessions.on:True
tools.sessions.storage_class = cherrypy.lib.sessions.FileSession
tools.sessions.storage_path = “/ some / directory”
Memcached后端
Memcached是一个的在RAM之上的分布式缓存系统, 如果你想在运行CherryPy的进程之外共享sessions,他是一个很好的选择。
需要安装Python的 memcached包。
tools.sessions.on:True
tools.sessions.storage_class = cherrypy.lib.sessions.MemcachedSession
其他后端
其他很多库也可以实现sessions后端。简单的子类cherrypy.lib.sessions.Session 并将子类表示为tools.sessions.storage_class.
原文:Any other library may implement a session backend. Simply subclass cherrypy.lib.sessions.Session and indicate that subclass as tools.sessions.storage_class.
静态文件服务
CherryPy可以为你的静态内容(如图像, JavaScript和CSS文件等)提供服务。
注意:CherryPy使用mimetypes模块来确定特定资源的最佳类型。如果选择无效,你可以简单的设置更多的媒体类型,如下所示
import mimetypes
mimetypes.types_map['.csv'] = 'text/csv'
提供单个文件
以下方式提供单个文件:
[/style.css]
tools.staticfile.on = True
tools.staticfile.filename = “/home/site/style.css”
提供整个目录
提供整个目录类似于单个文件:[/ static]
tools.staticdir.on = True
tools.staticdir.dir = “/ home / site / static”
假设你有一个静态/js/my.js文件, CherryPy将自动响应http://hostname/static/js/my.js等URL
注意:
CherryPy总是需要对他所服务的文件或目录提供绝对路径。如果有多个要配置的静态部分,但位于同一根目录中,则可以使用以下快捷方式:
[/]
tools.staticdir.root = “/ home / site”
[/ static]
tools.staticdir.on = True
tools.staticdir.dir = “static”
指定一个索引文件
默认情况下,CherryPy将对静态文件所在目录的根目录进行响应, 404错误表示“/”未找到,要指定索引,可以使用:
[/ static]
tools.staticdir.on = True
tools.staticdir.dir = “/ home / site / static”
tools.staticdir.index = “index.html”
假设您在static / index.html上有一个文件,CherryPy将通过响应http://hostname / static /等URL返回其内容来。
允许文件下载
使用响应类型”application/x-download“,可以告诉浏览器,应该将资源下载到用户的机器上,而不是显示。
示例:
from cherrypy.lib.static import serve_file
@cherrypy.expose
def download(self, filepath):
return serve_file(filepath, "application/x-download", "attachment")
处理JSON
CherryPy内置支持了对JSON编码的请求或响应的解码支持。
解码 request
自动解码JSON请求的内容
class Root(object):
@cherrypy.expose
@cherrypy.tools.json_in()
def index(self):
data = cherrypy.request.json
附加在请求的 JSON属性包含解码内容
编码response
使用JSON自动编码response的内容
class Root(object):
@cherrypy.expose
@cherrypy.tools.json_out()
def index(self):
return {'key': 'value'}
CherryPy将使用JSON对你的页面处理程序返回的任何内容进行编码, 并非所有类型的对象都可以被编码。
认证
CherryPy提供了两种非常简单的身份验证机制。两种描述如下
RFC2617::基本和摘要。 他们最常见的出发方式是
出发浏览器弹出窗口向用户询问他们的名字和密码。
Basic
Basic身份验证是最简单的验证方式,但他不是一个安全的身份验证,因为用户的凭证被嵌入到请求中。我们建议不要使用它,
除非你在SSL或封闭的网络中运行。
from cherrypy.lib import auth_basic
USERS = {'jon': 'secret'}
def validate_password(realm, username, password):
if username in USERS and USERS[username] == password:
return True
return False
conf = {
'/protected/area': {
'tools.auth_basic.on': True,
'tools.auth_basic.realm': 'localhost',
'tools.auth_basic.checkpassword': validate_password
}
}
cherrypy.quickstart(myapp, '/', conf)
该功能可以从任何来源读取数据:文件,数据库,内存等。
Digest
Digest认证的不同支出在于,凭证没有携带在请求中,因此他比Basic更安全。
示例:
from cherrypy.lib import auth_digest
USERS = {'jon': 'secret'}
conf = {
'/protected/area': {
'tools.auth_digest.on': True,
'tools.auth_digest.realm': 'localhost',
'tools.auth_digest.get_ha1': auth_digest.get_ha1_dict_plain(USERS),
'tools.auth_digest.key': 'a565c27146791cfb'
}
}
cherrypy.quickstart(myapp, '/', conf)
网站图标
CherryPy提供自己的红色cherrypy作为默认图标。你可以用以下方式提供自己的图标
import cherrypy
class HelloWorld(object):
@cherrypy.expose
def index(self):
return "Hello World!"
if __name__ == '__main__':
cherrypy.quickstart(HelloWorld(), '/',
{
'/favicon.ico':
{
'tools.staticfile.on': True,
'tools.staticfile.filename': '/path/to/myfavicon.ico'
}
}
)
你也可以使用文件进行配置:
[/favicon.ico]
tools.staticfile.on: True
tools.staticfile.filename: "/path/to/myfavicon.ico"
import cherrypy
class HelloWorld(object):
@cherrypy.expose
def index(self):
return "Hello World!"
if __name__ == '__main__':
cherrypy.quickstart(HelloWorld(), '/', app.conf)