当前位置: 首页 > 工具软件 > CherryPy > 使用案例 >

CherryPy中文文档-基础知识2

鲁浩言
2023-12-01

配置

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 = 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)

简单的说,你必须提供一个将有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)


 类似资料: