Создание курса Udacity Intro to Backend и изучение базовых веб-приложений2.Относительно новичок в программировании, поэтому я постараюсь быть ясным.Использование 64-битной Windows 7 Professional, если это имеет значение.
Одна вещь, на которую следует обратить внимание - я в основном использую Python 3.6 (Anaconda), но работаю 2.7 в виртуальной среде.Я не очень хорош в Python 2, и я впервые использую virtualenv.
У меня есть файл helloworld.py, который содержит класс MainPage, который наследуется от webapp2.RequestHandler и который содержит определения функций для get и post.В файле есть HTML-форма, в которой пользователю предлагается ввести месяц, день и год своего рождения в трех отдельных полях.Также есть кнопка отправки.
Когда пользователь вводит свою информацию, достоверность каждого дня, месяца и года должна проверяться отдельной функцией (все три находятся в отдельном модуле под названием verify_date).Каждая функция в основном проверяет, что информация имеет смысл (без бессмысленных слов или дат вне допустимого диапазона).Я знаю, что это не навязывает различную продолжительность месяцев (например, февраль имеет только 28 дней), но я не обеспокоен этим.
1) Если введенная пользователем информация действительна (например, «Январь», «1» и «2000»), страница должна принять информацию и загрузить сообщение с надписью: «Спасибо заПроверка!"Это работает.
2) Если какая-либо из трех частей информации недействительна, она должна перезагрузить форму, чтобы пользователь мог повторно ввести все.Это проблема.Если я ввожу номер вне диапазона для дня или года, это работает.Но если я введу выдуманное слово в поле «месяц», оно A) все равно загружает оператор проверки и B) записывает «декабрь» на веб-страницу (я добавил тестовый оператор) независимо от того, что фактически введено.Например, я мог бы ввести «Апрель» в поле, и оно все еще печатает «Декабрь».Что тут происходит?
ПРИМЕЧАНИЕ. Я протестировал функции проверки день / месяц / год независимо друг от друга в другой среде IDE, работающей на Python 3.6, и они отлично работали.
# helloworld.py
import webapp2
import verify_date
form = """
<form method="post">
What is your birthday?
<br>
<label>Month
<input type="text" name ="month">
</label>
<label>Day
<input type="text" name ="day">
</label>
<label>Year
<input type="text" name ="year">
</label>
<br>
<br>
<input type="submit">
</form>
"""
class MainPage(webapp2.RequestHandler):
def get(self):
#self.response.headers['Content-Type'] = 'text/plain'
self.response.out.write(form)
def post(self):
user_month = verify_date.valid_month(self.request.get('month'))
user_day = verify_date.valid_day(self.request.get('day'))
user_year = verify_date.valid_year(self.request.get('year'))
# Test: always prints what was actually entered in the field,
# as expected, even if it's gibberish
self.response.out.write(self.request.get('month'))
# Should return the month entered (capitalized by verify_date.valid_day)
# Prints December, regardless of what's entered
self.response.out.write(user_month)
# As expected, prints the entered day if in range. Reloads form otherwise
self.response.out.write(user_day)
# As expected, prints the entered day if in range. Reloads form otherwise
self.response.out.write(user_year)
if not(user_month and user_year and user_day):
self.response.out.write(form)
else:
self.response.out.write("Thanks for the validation!")
# Test: prints the entered month, even if gibberish
self.response.out.write(self.request.get('month'))
app = webapp2.WSGIApplication([
('/', MainPage),
], debug=True)
# verify_date.py
def valid_month(month):
months = ['January','February','March','April','May','June','July','August','September','October','November','December']
months = [month.lower() for month in months]
month = month.lower()
if month in months:
month = month[0].upper() + month[1::]
else:
print 'Sorry, that is a not a valid month.'
month = None
return month
def valid_day(day):
if day.isdigit() and int(day) < 32 and int(day) > 0:
day = int(day)
else:
day = None
return day
def valid_year(year):
if year.isdigit() and int(year) < 2021 and int(year) > 1899:
year = int(year)
else:
year = None
return year