2017-01-27 9 views
-1

Ich habe einige gelöste Fragen zu stackoverflow versucht, konnte aber nicht funktionieren. Kann mir jemand freundlicherweise dabei helfen? Ich benutze Flask für eines meiner Projekte und das ist der Fehler, den ich bekomme. Im Folgenden finden Sie den Code und die Rückverfolgung.Kann TypeError nicht reparieren: kann keine Objekte 'str' und 'NoneType' verketten

Der Code bezieht sich auf Zeile 12 in sqlutils.py.

import hashlib 
import os 
import oursql 
import uuid 
from flask import Flask 
from flask_sqlalchemy import SQLAlchemy 
from mainapp import app 

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+oursql://'+os.environ.get('DB_USR') \ 
             + ':' + os.environ.get('DB_PASSWD')+'@'\ 
             + os.environ.get('DB_HOST') + '/school_new' 
db = SQLAlchemy(app) 

Traceback:

Traceback (most recent call last): 
    File "run.py", line 3, in <module> 
    from mainapp import app 
    File "/home/osboxes/school/mainapp-web/mainapp/__init__.py", line 85, in <module> 
    import views 
    File "/home/osboxes/school/mainapp-web/mainapp/views.py", line 8, in <module> 
    from mainapp.students.availability_students import add_availability, delete_availability, get_availabilities_by_username, \ 
    File "/home/osboxes/school/mainapp-web/mainapp/students/availability_students.py", line 3, in <module> 
    from .sqlutils import build_where, build_set, get_connection 
    File "/home/osboxes/school/mainapp-web/mainapp/students/sqlutils.py", line 12, in <module> 
    + os.environ.get('DB_HOST') + '/school_new' 
TypeError: cannot concatenate 'str' and 'NoneType' objects 
+2

os.environ.get ('DB_HOST') ist wahrscheinlich keine – e4c5

+2

diese alle drucken: 'os.environ.get ('DB_USR'), os.environ.get ('DB_PASSWD'), os.environ.get ('DB_HOST') '1 von ihnen ist keiner. – MYGz

Antwort

0

Sie müssen einige sinnvolle Standardwerte liefern, wenn die Umgebung nicht enthält Ihre Einstellungen:

DB_HOST = os.environ.get('DB_HOST', 'localhost') 
DB_USR = os.envrion.get('DB_USR', 'root') 
DB_PASSWD = os.environ.get('DB_PASSWD', 'sekret') 

DB_URL = 'mysql+oursql://{}:{}@{}/school_new' 

app.config['SQLALCHEMY_DATABASE_URI'] = DB_URL.format(DB_USR, DB_PASSWD, DB_HOST) 

Oder einen Fehler auslösen, wenn kritische Einstellungen nicht zur Verfügung gestellt werden:

DB_HOST = os.environ.get('DB_HOST') 
DB_USR = os.environ.get('DB_USR') 
DB_PASSWD = os.environ.get('DB_PASSWD') 

if not all([DB_HOST, DB_USR, DB_PASSWD]): 
    raise Exception('Missing Database Environment Variables') 
0

Debug-Versuch:

app.config['SQLALCHEMY_DATABASE_URI'] = \ 
    'mysql+oursql://' + os.environ.get('DB_USR','NO_USER') \ 
    + ':' + os.environ.get('DB_PASSWD', 'NOPASSWD')+'@' \ 
    + os.environ.get('DB_HOST', 'NO_HOST') + '/school_new' 

Und log/Druck app.config['SQLALCHEMY_DATABASE_URI'].

+0

Es lässt mich nicht einmal in der Schale drucken. Immer wenn ich es mache, erscheint ein Fehler in env shell. –

0

Wenn der angeforderte Schlüssel im Wörterbuch nicht vorhanden ist, gibt .get()None zurück.

Also, angesichts der Fehler, die Sie bekommen, scheint es, dass es keine 'DB_HOST' in os.environ gibt.

Wenn es einige Standardwerte ('localhost' vielleicht?), Den Sinn für Sie in solchen Fällen zu bedienen ist, können Sie es als zweiten Parameter in Ihrem Anruf .get() hinzufügen und dann wird dieser Wert eher zurückgeführt wird als None wann immer Der Schlüssel existiert nicht.

os.environ.get('DB_HOST', 'localhost') 

Und wenn es überhaupt möglich ist, dass die anderen Tasten ('DB_USR' und 'DB_PASSWD') möglicherweise nicht vorhanden, sollten Sie entweder für sie geeignete Standardwerte hinzufügen oder irgendeine Form von Fehlerbehandlung verwenden.

0

Wie andere erwähnt haben, using .get() on a dictionary will result in a None if the value does not exist:

get(key[, default])

Return the value for key if key is in the dictionary, else default. If default is not given, it defaults to None , so that this method never raises a KeyError .

Es ist ein Wörterbuch, so dass man auch Dinge wie os.environ['DB_HOST'] statt .get() der Verwendung tun könnte. Warum? Denn dann würde beim Start ein Fehler auftreten, wenn der Wert nicht existiert! Was könnte in etwas so wichtig für Ihre Anwendung geschickt sein. :)

Okay, so scheinbar os.environ.get('DB_HOST') in Ihrem Code hat None zurückgegeben. Warum das?

os.environ gibt Ihnen Zugriff auf die Umgebungsvariablen des Betriebssystems aus der Shell. Anscheinend wurde die Variable DB_HOST nirgends gesetzt!

Um Ihr Problem zu lösen, müssen Sie die Umgebungsvariable DB_HOST in Ihrem Betriebssystem festlegen oder die Informationen auf andere Weise bereitstellen. Persönlich mag ich es, diese Werte als Befehlszeilenargumente über argparse zu übergeben, aber das liegt an Ihnen!


Falls Sie wirklich die OS Umgebung nutzen wollen, werde ich Ihnen ein Beispiel der Einrichtung einer Variable in der Bash geben (meine Shell). Sie müssten parallele Anweisungen für andere Shells nachschlagen.

Von der Bash-Befehlszeile ein:

$ export TEST_VAL="My hovercraft is full of eels." 
$ python 
(...) 
>>> import os 
>>> os.environ['TEST_VAL'] 
'My hovercraft is full of eels.' 

Beachten Sie, dass die Verwendung von os.environ in Python nicht gesetzt einen neuen Wert für diese Variable außerhalb der eigenen Interaktionen. Das heißt:

>>> os.environ['TEST_VAL'] = "new value" 
>>> exit() 
$ echo $TEST_VAL 
My hovercraft is full of eels. 
Verwandte Themen