Получить практические навыки по работе со спецификацией WSGI
.
Пример WSGI middleware, которое вставляет в тело HTML-страниц строки следующим образом:
<html>
<head>
...
</head>
<body>
<div class='top'>Middleware TOP</div>
...
<div class='botton'>Middleware BOTTOM</div>
</body>
</html>
Пример реализации:
from paste.httpserver import serve
TOP = "<div class='top'>Middleware TOP</div>"
BOTTOM = "<div class='botton'>Middleware BOTTOM</div>"
class WsgiTopBottomMiddleware(object):
'''
WSGI Middleware, которое добавляет TOP, BOTTOM в HTML документ
'''
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
response = self.app(environ, start_response).decode() # bytes to str
if response.find('<body>') > -1:
header, body = response.split('<body>')
data, htmlend = body.split('</body>')
data = '<body>' + TOP + data + BOTTOM+'</body>'
yield (header + data + htmlend).encode() # str to bytes
else:
yield (TOP + response + BOTTOM).encode() # str to bytes
def app(environ, start_response):
'''
WSGI приложение, которое отдает HTML документ
'''
response_code = '200 OK'
response_type = ('Content-Type', 'text/HTML')
start_response(response_code, [response_type])
return '''
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>HTML Document</title>
</head>
<body>
<p>
<b>
Этот текст будет полужирным,
<i>а этот — ещё и курсивным</i>
</b>
</p>
</body>
</html>
'''.encode() # str to bytes
# Оборачиваем WSGI приложение в middleware
app = WsgiTopBottomMiddleware(app)
# Запускаем сервер
serve(app, host='localhost', port=8000)
Описание заданий находится в разделе Работа с протоколом HTTP через telnet.
Написать WSGI приложение, которое отдает статикой файлы index.html и about.html.
Написать WSGI middleware, которое будет вставлять в HTML документ JavaScript и CSS файлы из списка типа:
includes = [
'app.js',
'react.js',
'leaflet.js',
'D3.js',
'moment.js',
'math.js',
'main.css',
'bootstrap.css',
'normalize.css',
]
Следующим образом:
<html>
<head>
...
<link rel="stylesheet" href="/_static/main.css"/>
<link rel="stylesheet" href="/_static/bootstrap.css"/>
<link rel="stylesheet" href="/_static/normalize.css"/>
</head>
<body>
...
<script src="/_static/app.js"></script>
<script src="/_static/react.js"></script>
<script src="/_static/leaflet.js"></script>
<script src="/_static/D3.js"></script>
<script src="/_static/moment.js"></script>
<script src="/_static/math.js"></script>
</body>
</html>
Делать не надо.