Создайте папку 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'