【问题标题】:TypeError: 'NoneType' object has no attribute '__getitem__' in Flask using SQLite3 [closed]TypeError:“NoneType”对象在使用 SQLite3 的 Flask 中没有属性“__getitem__”[关闭]
【发布时间】:2014-05-17 19:05:56
【问题描述】:

编辑:我发现了导致 NoneType 错误的原因,很抱歉打扰您。

在我的代码中,我想打开我的 records.db 并在其中获取最后一个索引,然后将此索引用作上传文件的名称(加一),但我的方法仅适用于普通 python 脚本,在 Flask 中我得到NoneType 错误..

这是我的代码:

import os
import datetime
import subprocess
import sqlite3
import sys
from flask import Flask, render_template, request, redirect, url_for, g
from werkzeug import secure_filename

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = 'uploads'
app.config['ALLOWED_EXTENSIONS'] = set(['txt', 'gro', 'doc', 'docx'])

DATABASE = 'records.db'

def allowed_file(filename):
    return '.' in filename and \
           filename.rsplit('.', 1)[1] in app.config['ALLOWED_EXTENSIONS']

def get_db():
    db = getattr(g, '_database', None)
    if db is None:
        db = g._database = sqlite3.connect(DATABASE)
    return db

def get_id():
    cur = get_db().cursor()
    cur.execute('SELECT id FROM Records ORDER BY id DESC LIMIT 1;')
    number = cur.fetchone()
    filenum = int(number[0])
    return filenum + 1

@app.teardown_appcontext
def close_connection(exception):
    db = getattr(g, '_database', None)
    if db is not None:
        db.close()

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/upload', methods = ['POST'])
def upload():
    num = get_id()
    file = request.files['file']
    if file and allowed_file(file.filename):
        file.save(os.path.join(app.config['UPLOAD_FOLDER'], num.filename))
        subprocess.call(['python', '/home/martyna/Dropbox/programowanie/project_firefox/topologia.py', 'uploads/'+num.filename])
        return "Thank you for uploading"


if __name__ == '__main__':
    app.debug = True
    app.run(host='0.0.0.0')

这:filenum = int(number[0]) 导致我的错误。我将不胜感激。

完整的错误跟踪:

Traceback (most recent call last):
  File "/home/martyna/Dropbox/programowanie/project_firefox/venv/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__
    return self.wsgi_app(environ, start_response)
  File "/home/martyna/Dropbox/programowanie/project_firefox/venv/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/home/martyna/Dropbox/programowanie/project_firefox/venv/lib/python2.7/site-packages/flask/app.py", line 1403, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/martyna/Dropbox/programowanie/project_firefox/venv/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/martyna/Dropbox/programowanie/project_firefox/venv/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/martyna/Dropbox/programowanie/project_firefox/venv/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/martyna/Dropbox/programowanie/project_firefox/venv/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/martyna/Dropbox/programowanie/project_firefox/venv/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/martyna/Dropbox/programowanie/project_firefox/hello.py", line 46, in upload
    filenum = int(number[0]) + 1
TypeError: 'NoneType' object has no attribute '__getitem__'

【问题讨论】:

  • 请提供完整的错误跟踪。

标签: python sqlite flask


【解决方案1】:

您的Records 表中可能没有元素。因此,cur.fetchone() 返回None,因此您实际上是在尝试访问None[0],因此出现错误消息。

顺便说一句,错误消息是告诉你你拿了[0] 的东西是None,所以如果你看这条线,你拿的唯一东西[0]number .因此,调试此类问题的一个好方法是在违规行之前添加print number 之类的内容,这通常会挑战我对变量内容的一些基本信念:)

【讨论】:

  • 你是对的。不知何故,我的数据库中的数据被删除了,我指的是不存在的东西
猜你喜欢
  • 2012-12-04
  • 2018-04-13
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 2014-07-03
  • 2017-01-08
  • 2017-08-17
相关资源
最近更新 更多