Работа с пользовательской регистрацией с низкой интенсивностью script. В части проверки ошибок script (которая фактически просто проверяет, чтобы поля не оставались пустыми), функция "addressError" работает без каких-либо проблем.
Но если я попытаюсь создать ошибки в любом другом поле, script истечет. Надеюсь, кто-то может понять, что мне не хватает?
Что работает:
def check_address(user, formdata):
if formdata.has_key("streetAddress") and formdata["streetAddress"].value != "":
streetAddress = formdata["streetAddress"].value
return streetAddress
else:
addressError(user, formdata)
def addressError(user, formdata):
feedback = {"blank_address" : "Please enter a valid street address! We won't mail you anything you don't order. Promise."}
stepTwoError(user, formdata, "blank_address", feedback)
Что не работает:
def check_city(user, formdata):
if formdata.has_key("city") and formdata["city"].value != "":
city = formdata["city"].value
return city
else:
cityError(user, formdata)
def cityError(user, formdata):
feedback = {"blank_city" : "Please enter a city!"}
stepTwoError(user, formdata, "blank_city", feedback)
def check_state(user, formdata):
if formdata.has_key("state") and formdata["state"].value != "":
state = formdata["state"].value
return state
else:
stateError(user, formdata)
def stateError(user, formdata):
feedback = {"blank_state" : "Please enter a state!"}
stepTwoError(user, formdata, "blank_state", feedback)
EDIT: Код, который вызывает следующие методы:
def get_stepTwoData(user, formdata):
firstName, lastName = check_name(user, formdata)
streetAddress = check_address(user, formdata)
city = check_city(user, formdata)
state = check_state(user, formdata)
zipCode = check_zipCode(user, formdata)
return firstName, lastName, streetAddress, city, state, zipCode
и в основном:
if regStep == "2":
firstName, lastName, streetAddress, city, state, zipCode = get_stepTwoData(user, formdata)
make_step3(user, regStep, firstName, lastName, streetAddress, city, state, zipCode, formdata)
Насколько я понимаю, эти три блока абсолютно одинаковы: "адрес", "состояние" и "город" используются взаимозаменяемо. Фактически, я мог бы написать функцию для включения всех трех из них сразу. Так почему же двое из них не работают?
(Примечание. Я не включаю функцию stepTwoError(), потому что я знаю, что она работает, поскольку она работает после вызова по адресу addressError - поскольку эта функция не изменяется, я знаю, что она работает. Поэтому я могу только предположить проблема заключается в размещенных блоках.)
Если я генерирую данные без ошибок, script выполняется просто отлично, поэтому я не вижу ошибки при чтении данных из формы. Все переменные возвращаются на следующей странице без проблем.
Это преследовало меня целыми днями. Я просто не понимаю. Надеюсь, что проблема будет в том, что я почувствую себя глупо из-за своей простоты.
Спасибо!
EDIT: Хорошо, ошибка, похоже, в моем HTML. Я не понял, что именно в script вызывает ошибку, но в html все формы "input type = 'text' name= '[name]'", за исключением поля адреса, которое является "входным" type = 'text' "- эти лишние пробелы что-то путают.
Спасибо тем, кто ответил терпеливо, и, да, я переписал код, чтобы больше относиться к меньшим возможностям транскрипции.
-Tom
У Python есть механизмы для динамического создания функций, которые полезны в таких ситуациях. Один из них - метакласс, который требует некоторого двойного косвенного мышления и может быть извилистым, чтобы думать. Более простой (и степпинг для изучения метаклассов) - это закрытие, функция, которая создает функцию, определяя ее локально, а затем возвращая эту локальную функцию. Вот как вы можете использовать закрытие для генерации всех ваших функций check_xxx:
def check_field(fieldname, errorname, errormessage):
def fn(user, formdata):
if fieldname in formdata and formdata[fieldname].value != '':
return formdata[fieldname].value
else:
feedback = {errorname : errormessage}
stepTwoError(user, formdata, errorname, feedback)
return fn
check_address = check_field("streetAddress", "blank_address", "Please enter a valid street address!")
check_city = check_field("city", "blank_city", "Please enter a city!")
check_state = check_field("state", "blank_state", "Please enter a state!")
check_zip = check_field("zip", "blank_zip", "Please enter a zip code!")
Закрытие отлично подходит для устранения кодирования вставки и частых ошибок, когда после вставки копии более ранней функции одна или несколько ссылок на имена переменных остаются неизменными от оригинала. Используя закрытие, вы можете быть намного увереннее в том, что ваши отдельные функции действительно являются действительными творениями из исходного шаблона.
Но я согласен с @JohnMachin, я тоже подозреваю, что ваша ошибка действительно находится в известном хорошем и эффективном методе, stepTwoError
. Попробуйте оценить свои поля ввода в другом порядке. У параметра stepTwoError есть аргумент по умолчанию, который является изменяемым объектом или списком? Возможно, это считается пустым, но сохраняет значения из предыдущего вызова? Или он обновляет глобальную переменную и оставляет ее в грязном состоянии, что приводит к ошибкам во втором вызове?
Эта "логика" ошибочна: "" (Примечание: я не включаю функцию stepTwoError(), потому что я знаю, что она работает, поскольку она работает после вызова addressError - поскольку эта функция не изменяется, я знаю, что это работает "
Все, что вы знаете, это то, что он работает, когда передается "blank_address" в качестве третьего аргумента. Предположим, что он содержит
if third_arg != "blank_address":
while 1:
pass