Оценка Python () и globals ()

Похоже, вы используете Apache для перезаписи URL. Почему бы вам просто не поместить login.html в корень вашего веб-приложения? Кто решил, что это должно быть в MyApp / App? Я думаю, что, возможно, MyApp происходит из вашего файла WAR, а App - это точка монтирования сервлета или что-то в этом роде, верно? Вы можете избавиться от пути WAR, назвав свой файл ROOT.WAR, , но есть и другие методы . Чтобы избавиться от App, вы можете смонтировать ваш сервлет в «/» или (если ваша платформа поддерживает это) использовать фильтр, а не сервлет для обслуживания ваших запросов.

Правило перезаписи, которое вы включили (это всего лишь одно правило), гласит: если URL-адрес запроса начинается с css, img и т. Д. (Регулярное выражение RewriteCond), то ничего не делайте (это означает, что «-» означает ) и прекратить оценку правил перезаписи ([L], что означает «Последний»). Это не кажется очень полезным для вашей ситуации, но это, вероятно, исключение: после него есть другие правила, которые мы хотим применить, и это разработано, чтобы избежать переписывания нескольких путей (css, img и т. Д.) что мы хотим оставить в покое.

8
задан Peter Mortensen 2 September 2016 в 19:53
поделиться

2 ответа

test_variable должен быть глобальным в test.py. Вы получаете ошибку имени, потому что пытаетесь объявить глобальную переменную, которая еще не существует.

Итак, ваш файл my_test.py должен выглядеть следующим образом:

test_variable = None

def my_func():
    print test_variable

И запустить это из командной строки:

>>> import my_test
>>> eval('my_test.my_func()')
None
>>> my_test.test_variable = 'hello'
>>> my_test.test_variable
'hello'
>>> eval('my_test.my_func()')
hello

Как правило, использовать eval () и глобальные переменные неправильно, поэтому убедитесь, что вы знаете, что делаете.

10
ответ дан 5 December 2019 в 12:12
поделиться

Пожалуйста, поправьте меня экспертами Python, если я ошибаюсь. Я также изучаю Python. Следующее - мое текущее понимание того, почему было сгенерировано исключение NameError .

В Python вы не можете создать переменную, к которой можно обращаться через модули без указания имени модуля (то есть для доступа к глобальной переменной test в модуле mod1 вам необходимо использовать mod1.test , когда вы в модуле mod2 ). Область применения глобальной переменной в значительной степени ограничена самим модулем.

Таким образом, когда вы используете в test.py :

def my_func():
    global test_variable
    print repr(test_variable)

Здесь test_variable ссылается на test.test_variable (то есть test_variable в пространстве имен модуля test test ).

Таким образом, установка test_variable в скрипте . py поместит переменную в пространство имен __ main __ ( __ main __ , потому что это модуль / скрипт верхнего уровня, который вы предоставили интерпретатору Python для выполнения). Таким образом, этот test_variable будет находиться в другом пространстве имен, а не в пространстве имен модуля test , где он должен быть. Следовательно, Python генерирует NameError , поскольку он не может найти переменную после поиска в глобальном пространстве имен модуля test и встроенном пространстве имен (пространство имен локальной функции пропускается из-за глобального имени ).

Поэтому, чтобы eval работал, необходимо установить test_variable в пространстве имен модуля test в script.py :

import test
test.test_variable = 'test_value'
eval('test.my_func()')

Подробнее о области видимости и пространствах имен в Python см .: http: //docs.python. org / tutorial / classes.html # python-scopes-and-name-space

4
ответ дан 5 December 2019 в 12:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: