Peewee und Bottle

Django, Flask, Bottle, WSGI, CGI…
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: 4149
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: 18217
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: 4149
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: 4149
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