Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 22, 2015 01:16:43

pyhton
Зарегистрирован: 2013-12-13
Сообщения: 64
Репутация: +  -2  -
Профиль   Отправить e-mail  

[web.py] что за хрень?

from __future__ import unicode_literals
import json
import sys
import web
class hello:
    def GET(self):
        return 'Hello %s' % var
urls = (
    '/', 'hello'
)
if __name__ == "__main__":
    var = 1
    print globals().keys()
    app = web.application(urls, globals())
    app.run()


При запросе выплевывает
  File ".py", line 23, in GET
return 'Hello %s' % var
NameError: global name 'var' is not defined

как это понимать?

Отредактировано pyhton (Июнь 22, 2015 01:17:04)

Офлайн

#2 Июнь 22, 2015 01:30:18

pyhton
Зарегистрирован: 2013-12-13
Сообщения: 64
Репутация: +  -2  -
Профиль   Отправить e-mail  

[web.py] что за хрень?

И вот это вот что за хрень?

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 раза??

Отредактировано pyhton (Июнь 22, 2015 01:30:35)

Офлайн

#3 Июнь 22, 2015 20:07:38

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

[web.py] что за хрень?

pyhton

В первом случае у тебя в контексте запроса не определена переменная var. Вот тут вроде бы все предельно ясно. В твоем случае :
class hello:
    def GET(self, var):
        return 'Hello %s' % web.websafe(var)
urls = (
    '/', 'hello'
)

Офлайн

#4 Июнь 22, 2015 22:06:01

pyhton
Зарегистрирован: 2013-12-13
Сообщения: 64
Репутация: +  -2  -
Профиль   Отправить e-mail  

[web.py] что за хрень?

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)

Офлайн

#5 Июнь 22, 2015 22:33:36

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

[web.py] что за хрень?

pyhton
Проблема в том, что webpy практически никто не использует. На этом форуме таких можно по-пальцам пересчитать. И то, они скорее не используют, а просто пробовали. Поэтому специально ставить webpy, чтобы проверить и поймать Вашу ошибку вряд-ли кто-то будет. Есть надежда только на кого-то, кто использовал этот фреймверк больше чем просто для “попробовать”…

Офлайн

#6 Июнь 22, 2015 23:18:09

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

[web.py] что за хрень?

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

Я не могу объяснить почему так происходит.

Офлайн

#7 Июнь 22, 2015 23:39:17

pyhton
Зарегистрирован: 2013-12-13
Сообщения: 64
Репутация: +  -2  -
Профиль   Отправить e-mail  

[web.py] что за хрень?

4kpt_III
Есть же логика работы питона. Я то думал что знаю питон, но, сука, блядь, не могу понять, почему из if __name__ == “__main__” в globals() есть var, а из GET() его в globals() нет. В этом и есть вся сила питона - один мудак может заставить тебя усомниться в том, что ты знаешь язык? Почему я с userjs, не зная ни языка, ни браузеров, с помощью гугла и матери худо-бедно разобрался за день, а с таким из себя хорошим питоном завис на ровном месте на 1,5 дня? И что, сука, интересно, у меня была другая программа, которая тоже использовала web.py, инициализировала глобальные переменные в if __name__ == “__main__”:, и, сука, работала! Ну что за блядство? Как можно вообще ухитриться так сделать?

Похоже, самым простым решением будет переход на flask. А web.py я юзал потому что у меня json api и шаблоны-маблоны мне нафиг не нужны, мне нужен был примитивнейший фреймвёрк.

Офлайн

#8 Июнь 23, 2015 00:16:02

pyhton
Зарегистрирован: 2013-12-13
Сообщения: 64
Репутация: +  -2  -
Профиль   Отправить e-mail  

[web.py] что за хрень?

<offtop>
ayb
Что это у тебя на аватаре?
</offtop>

Отредактировано pyhton (Июнь 23, 2015 00:16:28)

Офлайн

#9 Июнь 23, 2015 06:12:14

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

[web.py] что за хрень?

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. Так и кто мудак?



Офлайн

#10 Июнь 23, 2015 06:46:13

pyhton
Зарегистрирован: 2013-12-13
Сообщения: 64
Репутация: +  -2  -
Профиль   Отправить e-mail  

[web.py] что за хрень?

FishHook
А трижды мудак тот, кто ни разу не видел программы на web.py или похожих фреймверках.

Я прекрасно знаю, как работает импорт в питоне. И оно и без if __name__ глючило.

Отредактировано pyhton (Июнь 23, 2015 07:01:15)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version