我在stackoverflow上尝试了几个解决的问题,但无法使其工作。有人可以帮助我解决这个问题。我正在使用Flask进行我的一个项目,这是我得到的错误。以下是代码和回溯。
代码与sqlutils.py中的第12行相关。
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 (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
答案 0 :(得分:0)
调试试试:
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'
并记录/打印app.config['SQLALCHEMY_DATABASE_URI']
。
答案 1 :(得分:0)
当您请求值的键在字典中不存在时,.get()会返回None
。
因此,如果您收到错误,'DB_HOST'
中似乎没有os.environ
。
如果有一些默认值(可能是'localhost'
?),在这种情况下使用是有意义的,你可以在调用.get()
时将其添加为第二个参数,然后再添加该值每当密钥不存在时,将返回而不是None
。
os.environ.get('DB_HOST', 'localhost')
如果其他密钥('DB_USR'
和'DB_PASSWD'
)可能不存在,则应为其添加适当的默认值,或采用某种形式的错误处理。
答案 2 :(得分:0)
正如其他人所说,using .get()
on a dictionary will result in a None
if the value does not exist:
获取(键[,默认])
如果 key 在字典中,则返回键的值,否则默认。如果未指定默认,则默认为
None
,因此此方法永远不会引发KeyError
。
它是一本字典,因此您甚至可以执行os.environ['DB_HOST']
之类的操作,而不是使用.get()
。为什么?因为如果价值不存在,你就会在启动时收到错误!对于对您的应用程序如此重要的事情,这可能是非常好的。 :)
好的,您的代码中os.environ.get('DB_HOST')
显然已返回None
。那是为什么?
os.environ
使您可以从shell访问操作系统的环境变量。显然,变量DB_HOST
还没有设置在任何地方!
要解决您的问题,您必须在操作系统中为DB_HOST
设置环境变量,或者以其他方式提供信息。就个人而言,我喜欢通过argparse将这些值作为命令行参数传递,但这取决于您!
如果你真的想使用操作系统的环境,我将举一个在bash(我的shell)中设置变量的例子。您必须查找其他shell的并行指令。
从bash命令行:
$ export TEST_VAL="My hovercraft is full of eels."
$ python
(...)
>>> import os
>>> os.environ['TEST_VAL']
'My hovercraft is full of eels.'
请注意,在Python中使用os.environ
无法在其自身交互之外设置此变量的新值。也就是说:
>>> os.environ['TEST_VAL'] = "new value"
>>> exit()
$ echo $TEST_VAL
My hovercraft is full of eels.
答案 3 :(得分:0)
当环境不包含您的设置时,您需要提供一些合理的默认值:
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)
如果未提供关键设置,则引发错误:
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')