您的位置:首页 > 其它

CherryPy中文文档-基础知识2

2017-06-18 22:44 190 查看

配置

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


需要理解的是,请求cookie不会自动复制到响应cookie中。客户端在每个请求上发送相同的Cookie,
因此每次都要设置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 = cher
c23f
rypy.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)


简单的说,你必须提供一个将有CherryPy调用的函数,解码从请求中传递的用户名和密码。
该功能可以从任何来源读取数据:文件,数据库,内存等。

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: