Error: Working outside of application context

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
LukLuk
User
Beiträge: 11
Registriert: Montag 22. Juni 2015, 14:36

Heho zusammen,

Ich möchte eine Flask Website, mit Eingabefelder, schreiben und hab dazu eine Form Klasse geschrieben wo ich die ganzen Forms erstelle.
Wenn ich jetzt aber die Webseite aufrufe, wird mir nur eine Fehlermeldung angezeigt und in PyCharm wird die Fehlermeldung ausgegeben.
Hat jemand eine Idee wie ich dieses Problem lösen kann?

Die Fehlermeldung

Code: Alles auswählen

C:\Python27\python.exe D:/Programmieren/PhytonProjects/LdapRegistration/userinterface.py
Traceback (most recent call last):
  File "D:/Programmieren/PhytonProjects/LdapRegistration/userinterface.py", line 18, in <module>
    form=RegistrationForm() #Der Fehler tritt schon in der 14. Zeile auf diese Zeile ist nur dazu da um die Fehlermeldung zu erzeugen
  File "C:\Python27\lib\site-packages\wtforms\form.py", line 212, in __call__
    return type.__call__(cls, *args, **kwargs)
  File "C:\Python27\lib\site-packages\flask_wtf\form.py", line 68, in __init__
    csrf_enabled = current_app.config.get('WTF_CSRF_ENABLED', True)
  File "C:\Python27\lib\site-packages\werkzeug\local.py", line 338, in __getattr__
    return getattr(self._get_current_object(), name)
  File "C:\Python27\lib\site-packages\werkzeug\local.py", line 297, in _get_current_object
    return self.__local()
  File "C:\Python27\lib\site-packages\flask\globals.py", line 34, in _find_app
    raise RuntimeError('working outside of application context')
RuntimeError: working outside of application context
Die Form Klasse

Code: Alles auswählen

__author__ = 'Lukas'
from flask.ext.wtf import Form
from wtforms import StringField,RadioField
from wtforms.validators import DataRequired
from flask import app


class RegistrationForm(Form):
    i=1
    nachname=StringField('nachname',validators=[DataRequired()])
    vorname=StringField('vorname',validators=[DataRequired()])
    email=StringField('email',validators=[DataRequired()])
    handyNummer=StringField('handynummer',validators=[DataRequired()])
    bereich=RadioField('Bereich',choices=[('elektrotechnik','value1'),('maschienenbau','value2'),('gestaltung','value3'),('wirtschaft','value4'),('informatik','value5')])
Die "Main" Klasse wo ich Flask starte

Code: Alles auswählen

__author__ = 'Lukas'
__author__ = 'Lukas'
from flask import Flask
from flask import render_template
from flask import app
from forms import RegistrationForm

app = Flask(__name__)
app.config.from_object('config')


@app.route('/index',methods=['GET','POST'])
def index():

    form=RegistrationForm()

    return render_template('index.html')

form=RegistrationForm() #Der Fehler tritt schon in der 14. Zeile auf,
                                 #diese Zeile ist nur dazu da um die Fehlermeldung zu erzeugen

if __name__ == '__main__':
    app.run()


und hier noch der Config-File falls jemand den braucht

Code: Alles auswählen

__author__ = 'Lukas'
WTF_CSRF_ENABLED=True
SECRET_KEY='secret'
Danke schoneinmal im Vorraus.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Du kannst Formularinstanzen nicht auf Modulebene erstellen. Tust du dies nicht tritt auch der Fehler nicht auf.

In Zeile 14 von dem Code den du gepostest hast kann keine Fehlermeldung auftreten. Wenn du Hilfe haben willst zu dem Code den du nicht gepostet hast, solltest du diesen schon unverändert posten.
LukLuk
User
Beiträge: 11
Registriert: Montag 22. Juni 2015, 14:36

DasIch hat geschrieben:In Zeile 14 von dem Code den du gepostest hast kann keine Fehlermeldung auftreten.
Ups da ist mir die Zeile verrutscht, ich mein natürlich Zeile 15.
DasIch hat geschrieben:Du kannst Formularinstanzen nicht auf Modulebene erstellen.
Warum nicht? Ich hab ein Beispiel nachprogrammiert und dort wurde es Modular gemacht und es hat funktioniert.

Könnte es sein das es mit der Python Version zusammenhängt, denn ich benützte hier Python 2.7.9 und im Beispiel hab ich 3.4.3 benützt?
BlackJack

@LukLuk: Der Code auf Modulebene wird ausgeführt wenn das Modul das erste mal importiert wurde. Welche Werte sollten denn zu *dem* Zeitpunkt mit dem Formular verarbeitet werden? Da hat ja noch gar kein Zugriff von einem Browser aus stattgefunden.

Und wieso schreibst Du das auf Modulebene um eine Fehlermeldung zu erzeugen, denn die Fehlermeldung von Zeile 15 wäre doch die interessantere. Da kommt doch dann eine Fehlermeldung im Fehlerprotokoll des Webservers, wie lautet die? Und wenn da keine kommt, woher weisst Du dann das es genau *diese* Zeile ist, bei der ein Fehler auftritt?
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

LukLuk hat geschrieben:
DasIch hat geschrieben:In Zeile 14 von dem Code den du gepostest hast kann keine Fehlermeldung auftreten.
Ups da ist mir die Zeile verrutscht, ich mein natürlich Zeile 15.
Hast du index() selbst aufgerufen? Wenn nicht, wie startest du die Anwendung?
DasIch hat geschrieben:Du kannst Formularinstanzen nicht auf Modulebene erstellen.
Warum nicht? Ich hab ein Beispiel nachprogrammiert und dort wurde es Modular gemacht und es hat funktioniert.
Das Formular muss wissen zu welcher Anwendung es gehört, dazu benötigt es einen Application Context, dieser ist auf Modulebene nicht vorhanden es sei den du hast selbst einen erzeugt. In dem Beispiel kann dies auch nicht funktioniert haben oder es sieht anders aus.
Könnte es sein das es mit der Python Version zusammenhängt, denn ich benützte hier Python 2.7.9 und im Beispiel hab ich 3.4.3 benützt?
Nein.
LukLuk
User
Beiträge: 11
Registriert: Montag 22. Juni 2015, 14:36

Hm ich hab jetzt die RegisterForm Klasse in meine "Main" geschrieben und es funktioniert.

Danke.

Jedoch wundere ich mich warum das Beispiel funktioniert hat.

Könnt ihr mir sagen warum es funktioniert hat?

Die Beispiel Form Klasse

Code: Alles auswählen

from flask import Flask
from flask.ext.wtf import Form
from wtforms import StringField, BooleanField
from wtforms.validators import DataRequired

class LoginForm(Form):
    openid=StringField('openid',validators=[DataRequired()])
    remember_me=BooleanField('remember_me',default=False)
und hier wird die Form Klasse aufgerufen

Code: Alles auswählen

from flask import render_template
from forms import LoginForm

app = Flask(__name__)
app.config.from_object('config')

@app.route('/login',methods=['GET','POST'])
def login():
    form= LoginForm()
    print(form.openid.data)
    print(form.openid)
    print(form.remember_me)
    print(form.validate_on_submit())
    if form.validate_on_submit():
        print('TestString %s'%(form.openid.data))
        print('hi')
    return render_template('login.html',title='Sign in',form=form)

if __name__ == '__main__':
    app.run()

Die Config Datei ist die gleiche wie bei mir.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@LukLuk: was hat das für einen Sinn, eine Form in "Main" zu schreiben? Oder meinst Du, Du hast die Klassendefinition aus einem Modul ins Hauptskript verschoben? Es ist völlig egal, wo Du die Klasse definierst. Ich habe das Gefühl, dass Du per Zufallsprinzip irgendwelche Sachen änderst, und wenn dann glücklicherweise kein Fehler auftaucht, denkst Du, dass Du den Grund dafür gefunden hast.

Nochmal: Formulardaten werden aus den Anfragen eines Browsers erzeugt, das heißt, eine Instanz der Form-Klasse muß innerhalb einer Funktion erzeugt werden, die vom Flask-Dispatcher aufgerufen wird, so wie das es bei Deinem Beispiel auch gemacht wird. Also warum sollte es, wenn man es richtig macht, nicht funktionieren?
Antworten