Peewee und Bottle

Django, Flask, Bottle, WSGI, CGI…
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

noisefloor hat geschrieben:Hallo,
meego hat geschrieben:Muss ich das meinem .py file hinzufügen, damit Umlaute akzeptiert werden?
Wo hinzufügen? In Quelltext oder in den zu speichernden Daten?
Die Datenbank hat einen ASCII-Fehler gemeldet.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

dann poste doch mal den zugehörigen Code und die volle Fehlermeldung.

Gruß, noisefloor
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Hallo

Mit

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-
import os, sys
geht's.

"SyntaxError: Non-ASCII character '\xc3' in file xpeewee.py on line 122, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details"

Ich habe Mühe über das Bottle-Peewee-Plugin testweise Daten abzurufen:

Code: Alles auswählen

app = Bottle()
db = PeeweePlugin('sqlite:///x.db')

@route('/test')
def test():
    for room in Roomtype.select():
        print room

app.install(db)

if __name__ == '__main__':
    run(host='localhost', port=8080, debug=True, reloader=True)
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ich gehe mal davon aus, dass Zeile 122 im vollen Listing die mit dem `print` Statement ist? Das geht unter Python 2 davon aus, dass es nur ASCII-Zeichen bekommt, wenn man kein Encoding angibt. Details: siehe Link von jens.

Gibt es eigentlich einen bestimmten Grund, warum du kein Python 3 benutzt?

Gruß, noisefloor
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Hallo

Es wird ein Umlaut sein in meinem Dictionary sein.

Naja, es ist nicht Standard in Ubuntu. Man muss es explizit aufrufen.
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Code: Alles auswählen

File "x.py", line 17, in my_function
    return Roomtype.get(Roomtype.id == 1).roomtype_de
NameError: global name 'Roomtype' is not defined

Code: Alles auswählen

from bottle import Bottle, route, get, post, request, run, template
from bottle_peewee import PeeweePlugin

app = Bottle()
db = PeeweePlugin('sqlite:///x.db')

@route('/my_function')
def my_function():
	return Roomtype.get(Roomtype.id == 1).roomtype_de

app.install(db)
BlackJack

@meego: Natürlich bekommst Du diesen Fehler, das ist absolute Grundlage von Python das alle Namen irgendwo definiert sein müssen bevor man sie verwendet. Also braucht man mit Ausnahme der direkt in Python ”eingebauten” Namen entsprechenden Code der einen Namen bekannt macht. Wo ist denn das bei `Roomtype` in Deinem Code der Fall? Woher soll Python wissen was damit gemeint ist?
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Hi Blackjack

Ich dachte halt das Plugin macht die DB-Tabellennamen irgendwo bekannt.
Die Doku ist leider sehr spärlich:
https://pypi.python.org/pypi/bottle-peewee
BlackJack

@meego: Die Dokumentation ist deshalb spärlich weil das Plugin so gut wie nichts macht ausser dem Handling des Zyklus für einen einzelnen Request/Response, eben das man sich das nicht bei jedem mal selbst schreiben muss. Ansonsten ist das `database`-Attribut halt das Pewee-Datenbankobjekt. Das war's auch schon (fast). Alles andere steht in der Pewee-Dokumentation.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
meego hat geschrieben:Naja, es ist nicht Standard in Ubuntu. Man muss es explizit aufrufen.
Das ist ja mal ein denkbar schlapper Grund. Ob du `python` tipps oder `python3` spielt ja wohl mal keine Rolle. Und ab Ubuntu 15.10 wird wohl Python 3 das Default-Python unter Ubuntu :-) Aber egal, ist ein anderes Thema.

Gruß, noisefloor
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Hi

Also ich habe jetzt so ziemlich alle Varianten durchspekuliert..

Code: Alles auswählen

app = Bottle()
db = PeeweePlugin('sqlite:///x.db')

global db

@route('/my_function')
def my_function():
	return db.database.Roomtype.get(Roomtype.id == 1).roomtype_de

app.install(db)
return db.database.Roomtype.get(Roomtype.id == 1).roomtype_de
AttributeError: 'SqliteDatabase' object has no attribute 'Roomtype'
BlackJack

@meego: Wo hast *Du* denn die Klasse `Roomtype` definiert? Alternativ: Wo in der Dokumentation steht das Du die nicht definieren musst, sondern die auf irgendeine magische Weise irgendwo (ja wo denn?) existiert? Du scheinst hier das Code-Raten auf die Spitze zu treiben und Dir einfach mal so Magie zu wünschen und zu hoffen irgendeine zusammegwürfelte Variante von Code den Du gerne mit einer solchen Bedeutung hättest, würde schon funktionieren.
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Hi

In einer anderen .py-Datei mit der ich die DB erzeuge, ich dachte das Plugin kann die Tabellennamen auslesen:

Code: Alles auswählen

import os, sys
from bottle import Bottle
from bottle_peewee import PeeweePlugin
from peewee import Model, ForeignKeyField, CharField, TextField, IntegerField, BooleanField, DateTimeField, DateField, TimeField
import datetime

app = Bottle()
db = PeeweePlugin('sqlite:///x.db')

class BaseModel(Model):
    class Meta:
        database = db.proxy

class Roomtype(BaseModel):
	roomtype_de = CharField(max_length=80)
	roomtype_en = CharField(max_length=80)
	hint_de = CharField(max_length=250)
	hint_en = CharField(max_length=250)

app.install(db)           # unklar: befähigt was?

db.database.create_tables([Roomtype])

roomtypes = [
    {'roomtype_de': 'bla'},
    {'roomtype_de': 'bla'},
]

with db.database.atomic():
    Roomtype.insert_many(roomtypes).execute()
Ich muss also anders vorgehen?
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@meego: wie sollte denn eine Klasse, die irgendwo definiert wird plötzlich im Datenbankobjekt verfügbar sein? Du solltest wirklich mal die Dokumentation lesen.
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

@Sirius: Ich habe jetzt alles in eine Datei genommen. Wo aber das Objekt aus den Klassen erstellt wird, ist mir immer noch nicht ganz klar. Vielleicht mit
app.install(db) ?
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
meego hat geschrieben:Vielleicht mit app.install(db) ?
Nee, damit machst du das Plugin nur deiner Bottle-Applikation "bekannt".

Gruß, noisefloor
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Hallo

Okay. Und wo werden dann aus den Klassen jetzt Objekte erzeugt?
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wenn die Doku dir das nicht verrät, den wirf' das Modul weg und nimm' ein anderes ;-)

Gruß, noisefloor
Antworten