pyhton
Июнь 22, 2015 01:30:18
И вот это вот что за хрень?
from __future__ import unicode_literals
import web
print "bems"
class hello:
# /asdf -> name=asdf
def GET(self):
return 'Hello'
urls = (
'/', 'hello'
)
if __name__ == "__main__":
app = web.application(urls, globals())
app.run()
После запроса
bems
http://0.0.0.0:8080/
bems
127.0.0.1:1595 - - [22/Jun/2015 00:29:11] "HTTP/1.1 GET /" - 200 OK
Почему bems печатает 2 раза??
ayb
Июнь 22, 2015 20:07:38
pyhton
В первом случае у тебя в контексте запроса не определена переменная var.
Вот тут вроде бы все предельно ясно. В твоем случае :
class hello:
def GET(self, var):
return 'Hello %s' % web.websafe(var)
urls = (
'/', 'hello'
)
pyhton
Июнь 22, 2015 22:06:01
ayb, прошу прощения, но ты сам-то это проверял?
Finally, we pass i.name through the web.websafe function before returning it to the user. If your page is being served as HTML, rather than text, then this is an important security step to protect against cross-site scripting attacks. (As we will see, web.py's form templates offer built-in protection to those attacks).
И почему она должна быть определена в контексте запроса? Почему обработчик запроса не видит глобальную переменную (ИЧСХ, в другой программе он ее прекрасно видит)? Просьба перед следующим ответом проверить его (web.py ставится через pip install web.py)
4kpt_III
Июнь 22, 2015 22:33:36
pyhton
Проблема в том, что webpy практически никто не использует. На этом форуме таких можно по-пальцам пересчитать. И то, они скорее не используют, а просто пробовали. Поэтому специально ставить webpy, чтобы проверить и поймать Вашу ошибку вряд-ли кто-то будет. Есть надежда только на кого-то, кто использовал этот фреймверк больше чем просто для “попробовать”…
ayb
Июнь 22, 2015 23:18:09
pyhton
ayb, прошу прощения, но ты сам-то это проверял?
Да, не заметил объявления переменной.
from __future__ import unicode_literals
import json
import sys
import web
class hello:
def GET(self):
return 'Hello %s' % var
urls = (
'/', 'hello'
)
var = 1
if __name__ == "__main__":
app = web.application(urls, globals())
app.run()
Я не могу объяснить почему так происходит.
pyhton
Июнь 22, 2015 23:39:17
4kpt_III
Есть же логика работы питона. Я то думал что знаю питон, но, сука, блядь, не могу понять, почему из if __name__ == “__main__” в globals() есть var, а из GET() его в globals() нет. В этом и есть вся сила питона - один мудак может заставить тебя усомниться в том, что ты знаешь язык? Почему я с userjs, не зная ни языка, ни браузеров, с помощью гугла и матери худо-бедно разобрался за день, а с таким из себя хорошим питоном завис на ровном месте на 1,5 дня? И что, сука, интересно, у меня была другая программа, которая тоже использовала web.py, инициализировала глобальные переменные в if __name__ == “__main__”:, и, сука, работала! Ну что за блядство? Как можно вообще ухитриться так сделать?
Похоже, самым простым решением будет переход на flask. А web.py я юзал потому что у меня json api и шаблоны-маблоны мне нафиг не нужны, мне нужен был примитивнейший фреймвёрк.
pyhton
Июнь 23, 2015 00:16:02
<offtop>
ayb
Что это у тебя на аватаре?
</offtop>
FishHook
Июнь 23, 2015 06:12:14
pyhton
В этом и есть вся сила питона - один мудак может заставить тебя усомниться в том, что ты знаешь язык?
ИМХО мудак - это тот, кто по делу и без дела юзает глобальные переменные, а дважды мудак считает глобальными переменные определённые внутри условия.
# file test.py
from test_1 import Foo
f = Foo()
if __name__ == "__main__":
f.foo()
# file test_1.py
class Foo:
def foo(self):
print var
if __name__ == "__main__":
var = 4
Два вопроса:
1. Возникнет ли ошибка, если я запущу на выполнение файл test.py?
2. Так и кто мудак?
pyhton
Июнь 23, 2015 06:46:13
FishHook
А трижды мудак тот, кто ни разу не видел программы на web.py или похожих фреймверках.
Я прекрасно знаю, как работает импорт в питоне. И оно и без if __name__ глючило.