无法修复TypeError:无法连接'str'和'NoneType'对象

时间:2017-01-27 06:32:07

标签: python python-2.7 flask

我在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

4 个答案:

答案 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')