Usar uma variavel de um def() em outra view

已查看 94 次
跳至第一个未读帖子

Rafael Venancio Dias

未读,
2016年4月26日 13:26:542016/4/26
收件人 web2py-users-brazil
Meus amigos, mais uma pergunta que eu acho que é super simples mas eu não estou conseguindo resolver de jeito nenhum, já pesquisei de tudo e não consigo resolver.

Vamos ao problema:
Eu tenho num controller uma def() chamada logotipo, que faz uma busca num diretorio e pega randomicamente o nome de uma das imagens contidas no diretorio.
Na view logotipo tudo funciona direitinho, a logo é trocada a cada refresh.
Quando eu uso a variavel {{=random_logo}} dentro da view index.html dá um erro de "varial random_logo não definida".
Vamos a pergunta:
Como eu faço para passar o valor da string {{=random_logo}} dentro da view index.html?
CODIGO


CONTROLLER default.py
def index():
if request.post_vars:
hostname = str(request.post_vars.hostname)
return locals()

def logotipo():
import os, random
random_logo = random.choice(os.listdir("c:\\web2py\\applications\\One_Base\\static\\images\\logos"))
return locals()
VIEW index - Não funciona (erro "varial random_logo não definida")
<img src="/One_Base/static/images/oi_logos/{{=random_logo}}"/> </a>

VIEW logotipo - Funcionando
<img src="/One_Base/static/images/oi_logos/{{=random_logo}}"/> </a>

A variavel random_logo é igual a "Logomarca_RGB_Laranja_2D.png"


Relsi Hur Maron

未读,
2016年4月26日 13:47:002016/4/26
收件人 web2py-users-brazil

Se tu quiser expor uma função de forma global, coloca ela em um model. O ideal seria criar um módulo, que dai tu chama quando precisa, mas se é uma simples função coloca em um model mesmo.
已删除帖子

Rafael Venancio Dias

未读,
2016年4月26日 13:52:372016/4/26
收件人 web2py-users-brazil
Só faltou me dizer como fazer isso, pq eu não sei :)

Relsi Hur Maron

未读,
2016年4月26日 14:12:382016/4/26
收件人 web2py-users-brazil

A grosso modo o que eu quis dizer é que em vez de tu colocar essa tua função em um controller tu deve colocá-la em um model, pois assim tu pode chamar ela em qualquer parte da tua aplicação. Cria dentro do diretorio /model da tua app uma arquivo chamado (apenas como exemplo) logo.py e dentro dele coloque a tua função:


def logo():
import os, random
      random_logo = random.choice(os.listdir("c:\\web2py\\applications\\One_Base\\static\\images\\logos"))
   
return random_logo


Acho que ta te faltando ai uma base de como funciona o web2py, da uma boa lida na documentação [1], pois sem essa base fica meio complicado de tu seguir adiante.


[1] http://web2py.com/book

Rafael Venancio Dias

未读,
2016年4月26日 14:24:482016/4/26
收件人 web2py-users-brazil
Obrigado, vou tentar aqui e já retorno se deu certo ou não...

Você tem razão, eu tenho que ler muito sobre o web2py e sobre python também, eu sei que estou fazendo várias coisas erradas, mas vou seguindo e assim vou aprendendo...
Neste momento eu estou construindo uma aplicação na empresa que trabalho, não é minha função, não sou developer, sou engenheiro de Telecom, com conhecimentos em VBA, estou fazendo pelo aprendizado para o futuro, essa aplicação consulta várias querys num banco de dados MSSQL e retorna zilhoes de dados....

Ovidio Marinho

未读,
2016年4月26日 14:33:282016/4/26
收件人 web2py-us...@googlegroups.com
O que o Relsi quer falar é o Modelo MVC , se voce colocar a função no Model ela ficará global, se voce for usar em varios controladores, mas se for usar no mesmo controlador. Entenda o modelo MVC do Web2py e as coisas ficarão mais claras.






                   http://itjp.net.br
                     http://itjp.net.br
          Ovidio Marinho Falcao Neto
                 ovid...@gmail.com

                            Brasil
            

--
Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
Para enviar uma mensagem ao grupo, envie email a: web2py-us...@googlegroups.com
Para se desinscrever, envie email a: web2py-users-br...@googlegroups.com
Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en
---
Você recebeu essa mensagem porque está inscrito no grupo "web2py-users-brazil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para web2py-users-br...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Rafael Venancio Dias

未读,
2016年4月26日 14:51:122016/4/26
收件人 web2py-users-brazil
Eu entendi e é melhor fazer assim mesmo....só que infelizmente não está dando certo!!!

Estou fazendo desta forma:

Dentro da pasta models criei o arquivo logotipo_random.py
def logotipo_random():
import os, random
random_logo = random.choice(os.listdir("c:\\web2py\\applications\\One_Base\\static\\images\\logos"))
return random_logo()


no default.py
def index():
import logotipo_random
random_logo = random_logo
if request.post_vars:
hostname = str(request.post_vars.hostname)
return locals()

na view index.html
<img src="/One_Base/static/images/oi_logos/{{=random_logo}}"/>



Para se desinscrever, envie email a: web2py-users-brazil+unsub...@googlegroups.com

Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en
---
Você recebeu essa mensagem porque está inscrito no grupo "web2py-users-brazil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para web2py-users-brazil+unsub...@googlegroups.com.

Rafael Venancio Dias

未读,
2016年4月26日 15:01:482016/4/26
收件人 web2py-users-brazil
Tá dando o seguinte erro "

<type 'exceptions.ImportError'> Cannot import module 'applications.One_Base.modules.logotipo_random'

Relsi Hur Maron

未读,
2016年4月26日 15:19:292016/4/26
收件人 web2py-users-brazil

Antes da explicação quero reforçar o que eu disse anteriormente, sem uma base mínima de entendimento de como funciona as coisas vai ser difícil de tu tocar teu projeto adiante, esse tempo que tu esta perdendo com os erros é maior que o tempo que tu levaria para, pelo menos, fazer um apanhado geral da coisa.

Mas vamos lá.

Alguns pontos a serem observados no que tu fez.

1 - Quando tu coloca algo em um model, ele "fica disponível" para toda a tua aplicação, logo tu não precisa importar nada que esteja dentro de um model, quando for um módulo ai sim tu precisa importa. Model != Module.

2 - isso:

return random_logo()
 
Quer dizer que a tua função  logotipo_random  irá retornar a função random_logo() Sendo que o o que tu quer é retornar a variável random_logo

3 - Na tua função index (ou em qualquer outra que tu queira usar) tu deve chamar a função logotipo_random() e não o retorno dela, que no caso é a váriável random_logo. Tu pode fazer isso sem definir uma função, nesse caso poderia chamar a variável apenas, mas eu acho que isso não fica legal.

Enfim, segue como as coisas deveriam funcionar:

No arquivo /models/logotipo_random.py


def logotipo_random():
import os, random
random_logo = random.choice(os.listdir("c:\\web2py\\applications\\One_Base\\static\\images\\logos"))
return random_logo

No arquivo /controller/default.py

def index():
random_logo = logotipo_random()
if request.post_vars:
hostname = str(request.post_vars.hostname)
return locals()

na view:


<img src="/One_Base/static/images/oi_logos/{{=random_logo}}"/>

Como logotipo_random() é uma função global, e tu pode executar python na view, tu pode chamar ela diretamente se quiser:

<img src="/One_Base/static/images/oi_logos/{{=logotipo_random()}}"/>


Isso deve funcionar.

Rafael Venancio Dias

未读,
2016年4月26日 16:55:242016/4/26
收件人 web2py-users-brazil
Obrigado novamente pela dica, agora funcionou perfeitamente e isso vai me ajudar a fazer outras coisas que eu não sabia como iria fazer.

E sobre o a questão do reforço na questão do aprofundamento no conhecimento do framework, como eu disse anteriormente, estou na batalha, estudando e criando ao mesmo tempo, errando e aprendendo, perguntando e aprendendo ainda mais e criando essa base que me falta por não vir de uma vida como desenvolvedor.

Abraços e obrigado.
回复全部
回复作者
转发
0 个新帖子