Похоже, вы используете Apache для перезаписи URL. Почему бы вам просто не поместить login.html в корень вашего веб-приложения? Кто решил, что это должно быть в MyApp / App? Я думаю, что, возможно, MyApp происходит из вашего файла WAR, а App - это точка монтирования сервлета или что-то в этом роде, верно? Вы можете избавиться от пути WAR, назвав свой файл ROOT.WAR, , но есть и другие методы . Чтобы избавиться от App, вы можете смонтировать ваш сервлет в «/» или (если ваша платформа поддерживает это) использовать фильтр, а не сервлет для обслуживания ваших запросов.
Правило перезаписи, которое вы включили (это всего лишь одно правило), гласит: если URL-адрес запроса начинается с css, img и т. Д. (Регулярное выражение RewriteCond
), то ничего не делайте (это означает, что «-» означает ) и прекратить оценку правил перезаписи ([L]
, что означает «Последний»). Это не кажется очень полезным для вашей ситуации, но это, вероятно, исключение: после него есть другие правила, которые мы хотим применить, и это разработано, чтобы избежать переписывания нескольких путей (css, img и т. Д.) что мы хотим оставить в покое.
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 () и глобальные переменные неправильно, поэтому убедитесь, что вы знаете, что делаете.
Пожалуйста, поправьте меня экспертами 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