Recebendo dados de formulários e Configurando o CherryPy
dirceu
Chamando outros métodos
CherryPy pode também chamar diretamente métodos dos objetos publicados se ele receber uma URL que seja diretamente mapeada para esses métodos. Por exemplo:
def foo():
return 'Foo!'
foo.exposed = True
cherrypy.root.foo = foo
No exemplo, cherrypy.root.foo
contém uma função chamada foo
. Quando o CherryPy recebe uma requisição para a URI /foo
ele automaticamente chama a função foo()
. Note que isso pode ser uma função simples, um método ou qualquer outro objeto executável ("callable").
Em alguns casos avançados pode haver um conflito quando o CherryPy tenta decidir que método aplicar à uma requisição. O método index()
tem precedência, mas se o CherryPy encontra uma URL com o caminho todo válido e com o último objeto no caminho sendo executável (o que significa qualquer método, função ou objeto Python que suporte o método __call__
); e por fim, se o objeto executável não conter ele mesmo um método index()
válido, então o objeto em si vai ser executado. Essas regras são necessárias porque as próprias classes são executáveis em Python; executá-las produz uma nova instância. Pode parecer confuso, mas as regras são bem simples de serem usadas na prática.
Recebendo dados de formulários HTML
Qualquer método que é executado pelo CherryPy - seja index ou qualquer outro - pode receber dados de formulários HTML usando keyword arguments. Por exemplo, o formulário de login abaixo envia username (nome de usuário) e password (senha) como argumentos usando o método POST:
<form action="doLogin" method="post">
<p>Username</p><br>
<input name="username" size="15" maxlength="40" type="text"><br>
<p>Password</p><br>
<input name="password" size="10" maxlength="40" type="password"><br>
<p><input value="Login" type="submit"></p><br>
<p><input value="Clear" type="reset"></p><br>
</form>
O código abaixo pode tratar essa URL:
class Root:
def doLogin(self, username=None, password=None):
# check the username & password
...
doLogin.exposed = True
cherrypy.root = Root()
Ambos os argumentos tiveram que ser declarados como keyword arguments. O valor padrão pode ser usado tanto para prover um valor padrão para valores opcionais ou para prover um meio da aplicação saber se algum parâmetro da requisição está faltando.
CherryPy suporta ambos os métodos GET e POST para formulários. Argumentos são passados do mesmo jeito, independente do método utilizado pelo navegador web para mandar os dados para o servidor web.
O arquivo de configuração do CherryPy
O CherryPy usa um simples arquivo de configuração para customizar alguns aspectos do seu comportamento. O arquivo de configuração pode ser editado com qualquer editor de textos convencional (até mesmo o Bloco de Notas), e pode ser usado inclusive por "usuários comuns" (não-técnicos) para algumas customizações simples. Por exemplo:
[global]
server.socket_port = 8000
server.thread_pool = 10
session_filter.on = True
static_filter.root = "/home/site"
[/static]
static_filter.on = True
static_filter.dir = "static"
Muitos dos valores são auto-explicativos (por exemplo, server.socket_port
, que habilita a mudança da porta padrão na qual o CherryPy "escuta" requisições); outras necessidades precisam de um entendimento maior sobre os mecanismos internos do CherryPy.
- A opção
server.thread_pool
determina quantas threads o CherryPy vai usar para servir requisições. - A expressão
static_filter.root
especifica o diretório de onde os arquivos estáticos serão servidos. - A expressão
[/static]
especifica que o conteúdo estático vindo de/home/site/static/*
é servido como/static/*
- A expressão
session_filter.on
habilita o suporte à sessões. Sessões são necessárias para implementar aplicações web complexas com identificação de usuários, por exemplo.
O nome do arquivo de configuração pode ser passado como argumento para o método update()
; os valores vão ser lidos exatamente antes do servidor iniciar:
cherrypy.config.update(file="myserver.conf")
cherrypy.server.start()
As configurações podem também ser definidas como código Python puro usando dicionários e passando-os diretamente para cherrypy.config.update
.
cherrypy.server.start
A definição de cherrypy.server.start()
é:
def start(self, init_only=False, server_class=_missing):
"""
Main function. All it does is this:
- read/parse config file if any
- create response and request objects
- start HTTP server
"""
Para mudar a configuração da sua aplicação você pode passar um dicionário como keyword parameter para cherrypy.config.update()
como no exemplo abaixo:
cherrypy.config.update({
'global': {
'server.socket_port' : 8888,
'server.thread_pool' : 10 }})