How to get utf-8 from forms in Bottle?

时间:2015-10-30 21:25:26

标签: python forms encoding utf-8 bottle

I am trying to use Bottle.py to get input information from users in a web page.

Everything works fine except when I have latin characters (accents mostly). I have try using utf-8 and latin-1 coding on the first two lines of the code, but it won't work.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import bottle

@bottle.post('/newpost')
def post_newpost():
    subject = bottle.request.forms.get("subject")
    body = bottle.request.forms.get("body")
    tags = bottle.request.forms.get("tags")

and the html code from the page is:

<html>
<head>
<meta charset="utf-8" />
<title>New Posts</title>
</head>
<body>
<form action="/newpost" method="POST">

<h2>Post title</h2>
<input type="text" name="subject" size="120" value="{{subject}}" ><br>
<h2>Post<h2>
<textarea name="body" cols="120" rows="20">{{body}}</textarea><br>
<h2>Tags</h2>
<input type="text" name="tags" size="120" value="{{tags}}"><br>
<p>
<input type="submit" value="Submit">
</body>
</html>

I read in Bottle page that:

  • In Python 3 all strings are unicode, but HTTP is a byte-based wire protocol. The server has to decode the byte strings somehow before they are passed to the application. To be on the safe side, WSGI suggests ISO-8859-1 (aka latin1), a reversible single-byte codec that can be re-encoded with a different encoding later. Bottle does that for FormsDict.getunicode() and attribute access, but not for the dict-access methods. These return the unchanged values as provided by the server implementation, which is probably not what you want.

    request.query['city']

    'Göttingen' # An utf8 string provisionally decoded as ISO-8859-1 by the server

    request.query.city

    'Göttingen' # The same string correctly re-encoded as utf8 by bottle

If you need the whole dictionary with correctly decoded values (e.g. for WTForms), you can call FormsDict.decode() to get a re-encoded copy.

After reading that I tried using that function but don't know how. Right now Bottle form returns strings, so I can not use encode('utf-8') or decode('utf-8').

Please help me!

Thanks!

1 个答案:

答案 0 :(得分:5)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import bottle

@bottle.post('/newpost')
def post_newpost():
    subject = bottle.request.forms.subject
    body = bottle.request.forms.body
    tags = bottle.request.forms.tags

That will do it.... Thanks!