Простой Python — страница 63 из 66

Создайте папку templates и файл home.html, содержащий показанное. Если ваш сервер Flask все еще работает после запуска предыдущих примеров, он обнаружит новый контент и перезапустится.

5. Модифицируйте функцию home() вашего сервера, чтобы она использовала шаблон home.html. Передайте ей три параметра для команды GET: thing, height и color.

Перед вами файл flask3.py:

from flask import Flask, request, render_template

app = Flask(__name__)

@app.route('/')

def home():

····thing = request.values.get('thing')

····height = request.values.get('height')

····color = request.values.get('color')

····return render_template('home.html',

········thing=thing, height=height, color=color)

app.run(debug=True)

Перейдите в своем клиенте по следующему адресу:

http://localhost:5000/?thing=Octothorpe&height=7&color=green

Вы должны увидеть следующее:

I'm of course referring to Octothorpe, which is 7 feet tall and green.

Глава 10. Системы

1. Запишите текущие дату и время как строку в текстовый файл today.txt:

>>> from datetime import date

>>> now = date.today()

>>> now_str = now.isoformat()

>>> with open('today', 'wt') as output:

…·····print(now_str, file=output)

>>>

Вместо функции print вы могли бы использовать строку вроде output.write(now_str). Использование функции print добавляет символ перевода строки в конце.

2. Прочтите текстовый файл today.txt и разместите данные в строке today_string:

>>> with open('today', 'rt') as input:

…·····today_string = input.read()

>>> today_string

'2014-02-04\n'

3. Разберите дату из строки today_string:

>>> fmt = '%Y-%m-%d\n'

>>> datetime.strptime(today_string, fmt)

datetime.datetime(2014, 2, 4, 0, 0)

Если вы записали тот символ новой строки в файл, вам нужно, чтобы он совпал со строкой формата.

4. Выведите на экран список файлов текущей папки.

Если ваша текущая папка называется ohmy и содержит три файла с именами по названиям животных, код может выглядеть так:

>>> import os

>>> os.listdir('.')

['bears', 'lions', 'tigers']

5. Выведите на экран список файлов родительской папки.

Если родительская папка содержит два файла и текущую папку ohmy, код может выглядеть так:

>>> import os

>>> os.listdir('..')

['ohmy', 'paws', 'whiskers']

6. Используйте модуль multiprocessing, чтобы создать три отдельных процесса. Заставьте каждый из них ждать случайное количество секунд (от одной до пяти), вывести текущее время и завершить работу.

Сохраните этот файл под именем multi_times.py:

import multiprocessing

def now(seconds):

····from datetime import datetime

····from time import sleep

····sleep(seconds)

····print('wait', seconds, 'seconds, time is', datetime.utcnow())

if __name__ == '__main__':

····import random

····for n in range(3):

········seconds = random.random()

········proc = multiprocessing.Process(target=now, args=(seconds,))

········proc.start()

$ python multi_times.py

wait 0.4670532005508353 seconds, time is 2014-06-03 05:14:22.930541

wait 0.5908421960431798 seconds, time is 2014-06-03 05:14:23.054925

wait 0.8127669040699719 seconds, time is 2014-06-03 05:14:23.275767

7. Создайте объект date, содержащий дату вашего рождения.

Предположим, вы родились 14 августа 1982 года:

>>> my_day = date(1982, 8, 14)

>>> my_day

datetime.date(1982, 8, 14)

8. В какой день недели вы родились?

>>> my_day.weekday()

5

>>> my_day.isoweekday()

6

Для weekday() значение для понедельника равно 0, а для воскресенья — 6. Для функции isoweekday() значение для понедельника равно 1, а для воскресенья — 7. Поэтому искомый день — суббота.

9. Когда вам будет (или уже было) 10 000 дней от роду?

>>> from datetime import timedelta

>>> party_day = my_day + timedelta(days=10000)

>>> party_day

datetime.date(2009, 12, 30)

Если это был ваш день рождения, вы, возможно, пропустили еще один повод повеселиться.

Глава 11. Конкуренция и сети

1. Используйте объект класса socket, чтобы реализовать службу, сообщающую текущее время. Когда клиент отправляет на сервер строку 'time', верните текущие дату и время как строку ISO.

Вот так можно написать сервер udp_time_server.py:

from datetime import datetime

import socket

address = ('localhost', 6789)

max_size = 4096

print('Starting the server at', datetime.now())

print('Waiting for a client to call.')

server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

server.bind(address)

while True:

····data, client_addr = server.recvfrom(max_size)

····if data == b'time':

········now = str(datetime.utcnow())

········data = now.encode('utf-8')

········server.sendto(data, client_addr)

········print('Server sent', data)

server.close()

А так — клиент udp_time_client.py:

import socket

from datetime import datetime

from time import sleep

address····= ('localhost', 6789)

max_size···= 4096

print('Starting the client at', datetime.now())

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

while True:

····sleep(5)

····client.sendto(b'time', address)

····data, server_addr = client.recvfrom(max_size)

····print('Client read', data)

client.close()

Я поместил вызов sleep(5) в верхней части цикла клиента, чтобы сделать обмен данными менее быстрым. Запустите сервер в одном окне:

$ python udp_time_server.py

Starting the server at 2014-06-02 20:28:47.415176

Waiting for a client to call.

Запустите клиент в другом окне:

$ python udp_time_client.py

Starting the client at 2014-06-02 20:28:51.454805

Через 5 секунд вы начнете видеть сообщения в обоих окнах. Так выглядят первые три строки от сервера:

Server sent b'2014-06-03 01:28:56.462565'

Server sent b'2014-06-03 01:29:01.463906'

Server sent b'2014-06-03 01:29:06.465802'

А так — первые три строки от клиента:

Client read b'2014-06-03 01:28:56.462565'