2016-04-11 9 views
0

Ziel: Abrufen von Bugs aus der Bugzilla-Datenbank für analytische Zwecke, mit Django Framework, mit Django:1.9.4, Python:2.7DjangoUnicodeDecodeError auf Bugs aus Bugzilla-Datenbank (MySQL) Abrufen

Funktion Funktion aufzurufen (view.py)

@login_required(login_url='login/') 
def customerBugs(request): 
    tag_id = request.GET['tag_id'] 
    request.session['tagid'] = tag_id 
    tag_id = int(tag_id) 
    customer_names = {1:'Customer1', 2:'Customer2', 3:'Customer3'} 
    tag_name = customer_names[tag_id] 
    request.session[0] = tag_name 
    listbugs1 = list(listBugs(tag_name, request)) 
    return render(request, 'customerbugs.html', {'listbugs1': listbugs1, 'tag_name': tag_name}) 

Funktion die Details (bugzilla.py)

zu erhalten
def listBugs(tag_id,request): 
    db = MySQLdb.connect(host=DBhost, port=DBport, user=DBuser, passwd=DBpassword , db=DBdatabase) 

    sql1 = ('SELECT bug_id, short_desc, bug_status FROM bugzilla.bugs WHERE cf_customer_name = "%s"' %tag_id) 
    cursor = db.cursor() 
    cursor.execute(sql1) 
    data2 = cursor.fetchall() 
    db.close() 
    print data2 
    return data2 

die Fehler angezeigt mit wenigen Details (displayBugs.html)

{% extends 'base.html' %} 
{% block content %} 
<form method="" action="/downloadReport/"> 
<button type="submit" name="tag_id" value="{{request.session.tagid }}">Download</button> 
</form> 
<form method="get" action="/customerBugStatus/"> 
<button type="submit" style="float: right;" name="status_id" value="Open">Open Bugs 
</button> 
</form>  
<table border="1" style="width:100%"> 

<h2> Customer name: {{ tag_name }}</h2> 
<tr> 
<th>Bug ID</th> 
<th>Dscription</th> 
<th>Status</th> 
</tr> 
{% for bug in listbugs1 %} 

<tr> 
<td> 
    {{ bug.0 }}</a> 
</td> 
<td> 
    {{ bug.1 }}</a> 
</td> 
<td> 
    {{ bug.2 }}</a> 
</td> 
</tr> 
{% endfor %} 
{% endblock %} 

Es funktioniert nach Bedarf in Ordnung, außer in einem Fall:

Bug Zusammenfassung

1.8 – Load Calendar: Operational Error displayed when user is trying to load calendar via URL.

Nach 1.8 es Angenommen, Bindestrich (-), aber es ist nicht, \x96 beim Abruf.

Werfen Sie einen Fehler:

DjangoUnicodeDecodeError bei/customerBugs/

'utf8' codec can't decode byte 0x96 in position 4: invalid start byte. You passed in '1.8 \x96 Load Calendar: Operational Error displayed when user is trying to load calendar via URL.' (<type 'str'>)

Anfordern mich auf zu helfen, wie dieses Zeichen zu entschlüsseln, eine Menge Links versucht, kein Glück, Hilfe würde sehr geschätzt werden.

Antwort

0

ich ein wenig Änderungen auf bugzilla.py gemacht haben, die bearbeitet, hinzugefügt charset Parameter auf MySQLdb.connect()

Function to get the details (bugzilla.py)

def listBugs(tag_id,request): 
    db = MySQLdb.connect(host=DBhost, port=DBport, user=DBuser, passwd=DBpassword , db=DBdatabase, charset='utf8') 

    sql1 = ('SELECT bug_id, short_desc, bug_status FROM bugzilla.bugs WHERE cf_customer_name = "%s"' %tag_id) 

Danke.

1

hex 96 ist Latin1 Codierung für "EM DASH" (); hex E28093 ist die utf8-Codierung.

Sie müssen konsistent in der Codierung und Deklarationen sein, vorzugsweise utf8.

Überprüfen Sie, dass die Tabelle/Spalte auch CHARACTER SET utf8 ist.

Wenn Sie mit latin1 gehen wollen, dann ändern Sie die Django character_encoding zu "latin1".

+0

Tabelle hat utf8 als Standard encode 'ENGINE = InnoDB AUTO_INCREMENT = 5649 DEFAULT CHARSET = utf8;', ich möchte nicht mit latin1 gehen. – WEshruth

+0

Die Latin1 '96' kommt von irgendwo her. Finde die Quelle und behebe sie. –