В форме подтверждения всегда выводится «декабрь» за месяц: webapp2 и Google App Engine (Windows 7) - PullRequest
0 голосов
/ 03 мая 2019

Создание курса 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

1 Ответ

0 голосов
/ 03 мая 2019

Вы используете Python 2.x? Я думаю, что ваша проблема связана с этим вопросом: https://stackoverflow.com/a/4199355/2074794

В python 2 переменная month в вашем понимании списка переопределяет аргумент month, передаваемый вашей функции. Поэтому после выполнения следующей строки month содержит значение последнего элемента в вашем списке months, т.е. December:

months = [month.lower() for month in months]

Вы можете использовать другое имя переменной, чтобы избежать конфликта:

months = [m.lower() for m in months]

...