Web.py: o sistema de templates

Posted by Gabriel Verta | Posted in Python, web.py | Posted on 12-02-2010-05-2008

6

Após a apresentação do framework web.py, vamos ver como funciona o template engine do web.py.

Vamos começar criando os arquivos. Crie um arquivo chamado segundo.py, e ao lado uma pasta chamada templates.

Exemplo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import web
 
urls = (
    '/', 'Segundo'
)
 
app = web.application(urls, globals())
 
render = web.template.render('templates')
 
class Segundo(object):
    def GET(self):
        return render.segundo('Gabriel Verta')
 
if __name__ == '__main__':
    app.run()

Vamos descrever as novidades em relação ao exemplo da apresentação do framework:

9
render = web.template.render('templates')

Aciona o template engine para a pasta de nome templates, criada anteriormente.

13
return render.segundo('Gabriel Verta')

Indica que o retorno da chamada via GET será a renderização do template segundo.html, passando como parâmetro para o template a string ‘Gabriel Verta’.

Vamos então criar o arquivo segundo.html dentro da pasta templates.

1
2
3
4
5
6
7
8
9
$def with (nome)
<html>
    <head>
        <title>$nome</title>
    </head>
    <body>
        <h1>Olá, $nome</h1>
    </body>
</html>

A explicação:

1
$def with (nome)

Indica que o template irá receber uma variável, e que está dentro do template poderá ser utilizada como nome.

4
        <title>$nome</title>

Exibe o valor da variável nome, assim como na linha 7.

Rodando o arquivo segundo.py, e acessando http://localhost:8080/ veremos a mensagem: “Olá, Gabriel Verta”, além de a página ter o título “Gabriel Verta”.

Funcionalidades


Para exibição das variáveis na tela poderemos utilizar as seguintes sintaxes:

$string. 
Uma expressão ${valor1 + valor2}. 
Uma chave de dicionário $dicionario[chave]. 
$(limit)ando uma variável

Caracteres escapados

Caso uma variável string tenha o seguinte conteúdo a ser apresentado ao usuário: “20 > 10″, quando passamos esta string como parâmetro para o template ao exibi-lá ela será trocada por “20 > 10″. Para evitar que isto aconteça utilize a seguinte sintaxe:

$:nome

Escapando o cifrão ($)

$$

Estruturas de controle

1
2
3
4
5
6
7
8
9
10
11
12
$for i in range(10): 
    Contando: $i
 
$for i in range(10): Contando $i
 
$while posts:
    Exibe $posts.pop()
 
$if variavel1 > variavel2: 
    Eu já sabia que 20 era maior que 10
$else: 
    Como assim 20 não é maior que 10?

Repare na linha 2 que é necessário a tabulação, assim como nos scripts python, nos templates.

Nos próximos posts iremos ver estas demais funcionalidades em ação. ;)

Web.py: Framework para desenvolvimento web com Python

Posted by Gabriel Verta | Posted in Python, web.py | Posted on 10-02-2010-05-2008

2

Neste post venho lhes apresentar o framework web.py. Framework este voltado para web e de fácil aprendizagem e utilização, assim como a linguagem Python.

Caso ainda não tenha tido um contato com a linguagem recomendo uma passagem pelos tutoriais da Python Brasil.

Instalação
Uma das formas de instalar o framework é usando o setuptools, aplicativo para instalação de bibliotecas python.

No Ubuntu a instalação do setuptools pode ser feita através do seguinte comando:

$ sudo aptitude install python-setuptools

Vamos então a instalação do web.py:

$ sudo easy_install web.py

Como diriam lá na facul: Muuuuuuito fácil!

Outras formas de instalar podem ser vistas na página de install do web.py

Exemplo de utilização

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import web
 
urls = (
    '/', 'Primeiro'
)
 
app = web.application(urls, globals())
 
class Primeiro(object):
    def GET(self):
        return "Primeiro exemplo"
 
if __name__ == '__main__':
    app.run()

Vamos explicar por partes:

1
import web

Importa o framework para utilização na aplicação.

3
4
5
6
7
urls = (
    '/', 'Primeiro'
)
 
app = web.application(urls, globals())

Adiciona a uri / a aplicação. Quando a uri / for chamada a classe que será executada será a de nome Primeiro.

9
10
11
class Primeiro(object):
    def GET(self):
        return "Primeiro exemplo"

Quando utilizado do método GET, retornará a mensagem “Primeiro exemplo” ao usuário.

13
14
if __name__ == '__main__':
    app.run()

Coloca a aplicação para rodar, caso seja executado o script python diretamente.

Salve o arquivo como primeiro.py

Vamos então rodar o script:

$ python primeiro.py

Rodando o script será iniciado um servidor web rodando na porta padrão do web.py que é a 8080.

Acessando agora no navegador http://localhost:8080/. Ele irá exibir a mensagem que colocamos anteriormente.

Caso a porta 8080 já esteje em uso, você pode alterar a porta que a aplicação irá rodar passando como parâmetro ao script a porta que você deseja rodar a aplicação:

$ python primeiro.py 8090

Neste exemplo, o servidor web iniciará na porta 8090.

Nos próximos posts explicarei um pouco sobre o sistema de templates do web.py e acesso a banco de dados.

É isso ai ;)

UrlRewritingNet.UrlRewrite / Global.asax – Url amigável com .NET

Posted by Leticia Verta | Posted in .NET | Posted on 08-02-2010-05-2008

1

Após um workshop genial de SEO hoje, ver um amigo fazendo ctrl+c ctrl+v de páginas só para personalizar url e etc., vem um post sobre urls amigáveis, que nada mais é que uma técnica onde reescrevemos as urls antes que o que foi solicitado seja buscado no servidor, com o propósito de ter urls bem aceitas pelos motores de buscas, além de facilitar a “navegação manual” do usuário.

Eu, pessoalmente, uso um componente open source pra fazer isso em .NET, o UrlRewritingNet.UrlRewrite (só testei com o framework 2). Pra usar é absurdamente prático!
É necessário referenciar o UrlRewritingNet.UrlRewrite na sua aplicação e depois configurar devidamente no .config como explica na documentação (adicionar uma section e um httpModule do componente, além dos redirecionamentos desejados):

<?xml version="1.0"?>
<configuration>
 
    <configSections>
      <section name="urlrewritingnet"
               requirePermission ="false"
               type="UrlRewritingNet.Configuration.UrlRewriteSection, UrlRewritingNet.UrlRewriter"  />
    </configSections>
 
    <appSettings />
    <connectionStrings />
 
    <urlrewritingnet
      rewriteOnlyVirtualUrls="true"
      contextItemsPrefix="QueryString"
      defaultPage = "default.aspx"
      defaultProvider="RegEx"
      xmlns="http://www.urlrewriting.net/schemas/config/2006/07" >
      <rewrites>
        <add name="rwProduto"  virtualUrl="^~/(.*)/(.*)_(.*).html"
             rewriteUrlParameter="ExcludeFromClientQueryString"
             destinationUrl="~/DetalhesProduto.aspx?categoria=$1&amp;produto=$3"
             ignoreCase="true" />
      </rewrites>
    </urlrewritingnet>
 
    <system.web>
        <compilation debug="true"></compilation>
        <authentication mode="Windows" />
        <httpModules>
          <add name="UrlRewriteModule"
               type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter" />
        </httpModules>
    </system.web>
 
</configuration>

Reparem no redirecionamento que eu criei como exemplo …

     virtualUrl="^~/(.*)/(.*)_(.*).html"
     destinationUrl="~/DetalhesProduto.aspx?categoria=$1&amp;produto=$3"

Na url virtual eu recebo três variáveis e na de destino eu estou usando apenas 2 (o primeiro e o último), ou seja:

Pro usuário ->

www.ecommercerelaxos.com.br/celulares/celular-bonitao-mto-mais-que-barato_5394.html

$1 = celulares; $2 = celular-bonitao-mto-mais-que-barato; $3 = 5394

Pro servidor ->

www.ecommercerelaxos.com.br/DetalhesProduto.aspx?categoria=celulares&produto=5394

Eaí você trata as querystrings normalmente em DetalhesProduto. Excelente, heim?

Outro método tão simples quanto e sem precisar adicionar nada além de uma Global Application Class (.asax) e tratar a url, digamos que, como uma string. Assim você reescreve a url apenas pra chamada no servidor.

void Application_BeginRequest(object sender, EventArgs e)
{
     var httpContext = HttpContext.Current;
     var urlAmigavel = httpContext.Request.Path; 
 
     httpContext.RewritePath(String.Concat("relapsos.aspx?urlAmigavel=", urlAmigavel));
}

Além de ter o ASP.NET MVC Framework, que já trabalha com as urls bonitinhas de natureza … :P

Só queria deixar claro que pra todas as linguagens há um meio de fazer tais urls amigáveis, afinal, não há lógica em fazer um site “dinâmico” e criar as páginas na mão (?!?!?)
Caso fique alguma dúvida, fica aqui o exemplo com UrlRewritingNet.UrlRewrite e o com a Global.asax, ou entrem em contato.

Beijos! ;)