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)
相关文章推荐
- CherryPy中文文档-基础知识1
- 中文字符集与字符编码的基础知识
- 中文字符集与字符编码的基础知识(转)
- 中文编码基础知识介绍
- lua脚本文档中文翻译(基础)
- lua脚本文档中文翻译(基础)
- LUA脚本文档中文翻译(基础)
- HTML基础知识 - XML文档解析
- 中文字符集与字符编码的基础知识
- Java 开发中文基础文档
- Java媒体架构基础(jmf文档中文翻译)
- 中文字符集与字符编码的基础知识
- 中文字符集编码的基础知识
- RFC5415中文文档及WLAN相关知识
- 中文字符集与字符编码的基础知识
- 中文字符集与字符编码的基础知识 (转)
- 中文字符集与字符编码的基础知识
- 中文编码基础知识介绍
- 软件工程基础知识-软件生存周期及其产生的文档
- Sequel中文文档-模型-关联基础