BaseHTTPRequestHandler Utf-8
Verfasst: Sonntag 26. Juni 2016, 14:34
Hallo alle zusammen,
Ich habe zurzeit ein Problem welches ich nicht so einfach Lösen kann, da ich nicht genug Informationen, weder über Google noch über den Docs was finde.. Es geht um eine App und das ich eine "Fehler melden" Funktion hinzufügen möchte. Dabei muss ich Daten vom Android Gerät zu meinem Raspberry Pi senden. Dieser ist über Dyn DNS zu erreichen. Ich würde es einfacher finden, würde ich einen TCP Server schreiben, allerdings denke ich das ein Http Server besser und sicherer sind. Außerdem hab ich das senden von Http über Post schon integriert.
Der Server soll nur Empfangen und eine Antwort senden.
Erstmal die Daten die ich bekomme, wenn sonstiges keine UTF-8 zeichen beinhaltet.
Jetzt der Fehler der kommt, wenn ich UTF-8 zeichen sende.
und nun zum Code: (Version 3.4)
PS; Der Code ist "geklaut", da ich wirklich keine Ahnung habe wie ich eine http request parsen muss.. In Php ist das so einfach, deswegen wundert es mich, das Python das nicht so einfach kann ..
1. Möglichkeit zum empfangen von UTF-8?
2. Kann ich den Code soweit auch dem Internet zugänglich machen? Verbesserungsvorschläge nehme ich gerne entgegen
Ich sag schon mal danke fürs Lesen
Mit freundlichen Grüßen
Trayser
PS: wie kann ich dem Code Block sagen, dass das Python ist?
Ich habe zurzeit ein Problem welches ich nicht so einfach Lösen kann, da ich nicht genug Informationen, weder über Google noch über den Docs was finde.. Es geht um eine App und das ich eine "Fehler melden" Funktion hinzufügen möchte. Dabei muss ich Daten vom Android Gerät zu meinem Raspberry Pi senden. Dieser ist über Dyn DNS zu erreichen. Ich würde es einfacher finden, würde ich einen TCP Server schreiben, allerdings denke ich das ein Http Server besser und sicherer sind. Außerdem hab ich das senden von Http über Post schon integriert.

Der Server soll nur Empfangen und eine Antwort senden.
Erstmal die Daten die ich bekomme, wenn sonstiges keine UTF-8 zeichen beinhaltet.
Code: Alles auswählen
{b'lehrgang': [b'Truppmann1'], b'textSize': [b'false'], b'sonstiges': [b''], b'saveFalse': [b'false'], b'questsWrong': [b'false'], b'logs': [b'']}
Code: Alles auswählen
Exception happened during processing of request from ('192.168.2.176', 52046)
----------------------------------------
Traceback (most recent call last):
File "S:\SDK\Python34\lib\socketserver.py", line 306, in _handle_request_noblock
self.process_request(request, client_address)
File "S:\SDK\Python34\lib\socketserver.py", line 332, in process_request
self.finish_request(request, client_address)
File "S:\SDK\Python34\lib\socketserver.py", line 345, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "S:\SDK\Python34\lib\socketserver.py", line 666, in __init__
self.handle()
File "S:\SDK\Python34\lib\http\server.py", line 400, in handle
self.handle_one_request()
File "S:\SDK\Python34\lib\http\server.py", line 388, in handle_one_request
method()
File "C:/Users/Patrick/Desktop/untitled/report_server.py", line 26, in do_POST
postvars = self.parse_POST()
File "C:/Users/Patrick/Desktop/untitled/report_server.py", line 20, in parse_POST
keep_blank_values=1)
File "S:\SDK\Python34\lib\urllib\parse.py", line 553, in parse_qs
encoding=encoding, errors=errors)
File "S:\SDK\Python34\lib\urllib\parse.py", line 605, in parse_qsl
value = _coerce_result(value)
File "S:\SDK\Python34\lib\urllib\parse.py", line 92, in _encode_result
return obj.encode(encoding, errors)
UnicodeEncodeError: 'ascii' codec can't encode character '\ufffd' in position 50: ordinal not in range(128)
192.168.2.176 - - [26/Jun/2016 15:17:44] "POST / HTTP/1.1" 200 -
Code: Alles auswählen
from http.server import BaseHTTPRequestHandler, HTTPServer
from urllib.parse import parse_qs
from cgi import parse_header, parse_multipart
class ReportHandler(BaseHTTPRequestHandler):
def do_HEAD(self):
self.send_response(200)
self.send_header("Content-type", "text/html")
self.end_headers()
def parse_POST(self):
ctype, pdict = parse_header(self.headers['content-type'])
if ctype == 'multipart/form-data':
postvars = parse_multipart(self.rfile, pdict)
elif ctype == 'application/x-www-form-urlencoded':
length = int(self.headers['content-length'])
postvars = parse_qs(
self.rfile.read(length),
keep_blank_values=1)
else:
postvars = {}
return postvars
def do_POST(self):
postvars = self.parse_POST()
print(postvars)
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
def main():
server = HTTPServer(('', 21606), ReportHandler)
try:
print('Started http server')
server.serve_forever()
except KeyboardInterrupt:
print('^C received, shutting down server')
server.socket.close()
if __name__ == "__main__":
main()
PS; Der Code ist "geklaut", da ich wirklich keine Ahnung habe wie ich eine http request parsen muss.. In Php ist das so einfach, deswegen wundert es mich, das Python das nicht so einfach kann ..
1. Möglichkeit zum empfangen von UTF-8?
2. Kann ich den Code soweit auch dem Internet zugänglich machen? Verbesserungsvorschläge nehme ich gerne entgegen

Ich sag schon mal danke fürs Lesen

Mit freundlichen Grüßen
Trayser
PS: wie kann ich dem Code Block sagen, dass das Python ist?
