Практика: создание простых веб-приложений на Python

Александр Колосов

Основы Python

Переменные

some_var = 5
other_var = some_var + 15
print(other_var)
20

См. также страницу An Informal Introduction to Python официального руководства.

other_var = some_var + 15
NameError: global name 'some_var' is not defined

Типизация: динамическая, строгая

name = "John"
message = name + " is old."
print(message)
John is old.

См. также страницу Built-in Types официального руководства.

years = 5
name = "John"
message = name + " is " + years + " years old."
print(message)
TypeError: cannot concatenate 'str' and 'int' objects
years = 5
name = "John"
message = name + " is " + str(years) + " years old."
print(message)
John is 5 years old.

Списки (lists)

s = [1, 3, 9, 27, 81, 3]
print( len(s) )
print( s[2] )
print( 4 in s )
print( s[2:5] )
print( s[0:5:2] )
print( s.count(3) )
6
9
False
[9, 27, 81]
[1, 9, 81]
2

См. также страницу Lists официального руководства.

Словари (dictionaries)

gold_medals = {'USA': 46, 'UK': 27, 'China': 26, 'Russia': 19}
silver_medals = dict(USA=37, UK=23, China=18, Russia=18)

print( gold_medals['Russia'] )
print( silver_medals['China'] )
print( silver_medals.get("Finand", 0) )
print( gold_medals.keys() )
print( silver_medals.values() )
print( "Russia" in gold_medals )
19
18
0
['China', 'UK', 'USA', 'Russia']
[23, 18, 18, 37]
True

См. также страницу Mapping Types — dict официального руководства.

Строки

simple_str = "абвгд"
multi_str = """
Однажды, в студеную зимнюю пору
Я из лесу вышел; был сильный мороз.
Гляжу, поднимается медленно в гору
Лошадка, везущая хворосту воз.
"""

См. также страницу Text Sequence Type — str официального руководства.

Форматирование строк

alphabet = "АБВГДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
n = 5
msg = "{}-я буква алфавита — это '{}'"
print( msg.format(n, alphabet[n - 1]) )
5-я буква алфавита — это 'Д'

См. также страницу Format examples официального руководства.

Циклы

for i in range(1,5):
    print("{}² = {}".format(i, i**2))
1² = 1
2² = 4
3² = 9
4² = 16

См. также страницы for Statements и The range() Function официального руководства.

Условия

div_by_3 = []
for i in range(20):
    if i % 3 == 0:
        div_by_3.append(i)

print(div_by_3)
[0, 3, 6, 9, 12, 15, 18]

См. также страницу if Statements официального руководства.

Проход по словарю

gold_medals = {'USA': 46, 'UK': 27, 'China': 26, 'Russia': 19}

for k in gold_medals:
    print("{}: {} medals".format(k, gold_medals[k]))
China: 26 medals
UK: 27 medals
USA: 46 medals
Russia: 19 medals

Проход по сортированному словарю

gold_medals = {'USA': 46, 'UK': 27, 'China': 26, 'Russia': 19}

for k in sorted(gold_medals, key=gold_medals.get, reverse=True):
    print("{}: {} medals".format(k, gold_medals[k]))
USA: 46 medals
UK: 27 medals
China: 26 medals
Russia: 19 medals

Простые веб-приложения на Python

Элементарное CGI-приложение на Python

#!/usr/bin/env python3

print("Content-type: text/html")
print()

print("Hello, browser!")

Более сложное формирование вывода

#!/usr/bin/env python3

print("Content-type: text/html")
print()

print("""

Первое веб-приложение

Список овощей

""") vegs = ["морковка", "свекла", "картошка", "помидор"] print("
    ") for v in vegs: print("
  • {}
  • ".format(v)) print("
")

Обработка параметров запроса

#!/usr/bin/env python3
import cgi

vegs = ["морковка", "свекла", "картошка", "помидор"]
fruits = ["яблоко", "груша", "апельсин", "персик"]

what_to_list = None
the_list = []

params = cgi.FieldStorage()
list_type = params.getvalue("type")

if params["type"] == "v":
    what_to_list = "овощей"
    the_list = vegs

elif params["type"] == "f":
    what_to_list = "фруктов"
    the_list = fruits

print("Content-type: text/html")
print()

print("""

Список овощей и фруктов
""")

title = "Тип списка не задан"
if what_to_list:
    title = "Список " + what_to_list

print("

{}

".format(title)) print("
    ") for item in the_list: print("
  • {}
  • ".format(item)) print("
")

См. также описание модуля cgi.

Использование шаблонизатора (Jinja2)

#!/usr/bin/env python3
import cgi
import jinja2
import cgitb

cgitb.enable()

vegs = ["морковка", "свекла", "картошка", "помидор"]
fruits = ["яблоко", "груша", "апельсин", "персик"]

what_to_list = None
the_list = []

tpl = jinja2.Template("""Content-type: text/html\r\n\r\n

Список овощей и фруктов

{{ list_title }}

    {% for i in items %}
  • {{ i }}
  • {% endfor %}
""") params = cgi.FieldStorage() list_type = params.getvalue("type") if list_type == "v": what_to_list = "овощей" the_list = vegs elif list_type == "f": what_to_list = "фруктов" the_list = fruits title = "Тип списка не задан" if what_to_list: title = "Список " + what_to_list print(tpl.render(list_title=title, items=the_list))

См. также страницу проекта Jinja2.

Упражнения для самостоятельной работы

  1. Вывод списка овощей с проверкой на "спорные" овощи (например помидор). Спорные овощи должны выводится в списке зачеркнутыми.
  2. Сервис по определению типа растения (овощ, фрукт, неизвестно). Должна быть форма для ввода названия с кнопкой.