Ніколи не мав справи з bottle, але, припускаю, шукати треба десь у цьому напрямку:
class FormsDict(*a, **k)
This MultiDict subclass is used to store request form data. Additionally to the normal dict-like item access
methods (which return unmodified data as native strings), this container also supports attribute-like access to
its values. Attributes are automatically de- or recoded to match input_encoding (default: ‘utf8’). Missing
attributes default to an empty string.
input_encoding = ‘utf8’
Encoding used for attribute values.
recode_unicode = True
If true (default), unicode strings are first encoded with latin1 and then decoded to match
input_encoding.
decode(encoding=None)
Returns a copy with all keys and values de- or recoded to match input_encoding. Some libraries (e.g.
WTForms) want a unicode dictionary.
getunicode(name, default=None, encoding=None)
Return the value as a unicode string, or the default.
POST, наскільки я можу зрозуміти, є екземпляром цього класу. А те, що відбулося, виглядає як розкодування параметрів форми з latin1. Можливо, треба в main_post() попередньо зробити
request.POST.recode_unicode=False
чи замінити на
return '<pre><b>Значення:</b> ' + request.POST.decode('utf-8')['name'] + '</pre>'
чи зробити ще якусь магію з POST. Експериментуйте.
З власного досвіду, подібна проблема виникає в більшості веб-API, де використовується юнікодівський внутрішній формат рядка (а не рядки байтів) — західне кодування вважається дефолтовим для веб, і дані форм розкодовуються з нього, або ж сторінка кодується в нього...
P.S. Схоже, моє повідомлення не містить правильного рішення