首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >退出OSError服务器在app.run(debug=True)时引发“app.run:[Errno 9]坏文件描述符”

退出OSError服务器在app.run(debug=True)时引发“app.run:[Errno 9]坏文件描述符”
EN

Stack Overflow用户
提问于 2017-03-08 20:55:34
回答 1查看 2.5K关注 0票数 0

这仅仅是使用烧瓶调试过程的一部分吗?这是因为Flask服务器正在读取它正在写入的文件吗?我没有正确地关闭连接吗?

我能收集到的 errno(9)指示:

(坏的文件号),当您使用的文件描述符无效时。文件描述符不是指未打开的文件,就是对只为写入(或读取)打开的文件发出读(或写)请求。如果您正在进行套接字编程,则套接字描述符在对其进行任何操作之前已经关闭,并且可能会导致此错误。

我正在使用Virtualenv 15.1.0、Python3.6.0和Flask 0.12 &

代码语言:javascript
复制
$  pip freeze
appdirs==1.4.2
click==6.7
Flask==0.12
itsdangerous==0.24
Jinja2==2.9.5
MarkupSafe==0.23
packaging==16.8
pyparsing==2.1.10
requests==2.13.0
six==1.10.0
Werkzeug==0.11.15

这是我正在编写的代码,它在退出服务器时调用错误:

代码语言:javascript
复制
from flask import Flask, render_template, request, jsonify
import sqlite3
app = Flask(__name__)

connection = sqlite3.connect('database.db')
connection.execute('CREATE TABLE IF NOT EXISTS films (title TEXT, rating INTEGER)')
connection.close()      <------------------ IMPROPER CLOSURE?

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

@app.route('/movie', methods = ['POST'])
def add_movie_function():
    connection  = sqlite3.connect('database.db')
    cursor      = connection.cursor()
    title       = request.form['title']
    rating      = request.form['rating']
    try:
        query   = 'INSERT INTO films (title, rating) VALUES (?, ?)'
        cursor.execute(query, (title, rating))
        connection.commit()
        message = 'Successfully inserted title and rating data into movies table!'
    except:
        connection.rollback()
        message = 'There was an issue with inserting data into the movies table :('
    finally:
        connection.close() <------------------ IMPROPER CLOSURE?
        return message

@app.route('/movies', methods = ['GET'])
def list_all_movies():
    connection = sqlite3.connect('database.db')
    cursor = connection.cursor()
    try:
        cursor.execute('SELECT * FROM films')
        connection.commit()
        search_result = jsonify(cursor.fetchall())
    except:
        search_result = 'An error occured getting all the film titles'
    finally:
        connection.close() <------------------ IMPROPER CLOSURE?
        return search_result

app.run(debug = True)

...and这是完整的回溯:

代码语言:javascript
复制
(venv) 66 Wed Mar 08 15:29:11$  export FLASK_APP=simpleFlaskAPI.py 
(venv) 67 Wed Mar 08 15:42:08$  flask run
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger pin code: 230-157-201
127.0.0.1 - - [08/Mar/2017 15:42:21] "GET /movies HTTP/1.1" 200 -
^C * Serving Flask app "simpleFlaskAPI"
Traceback (most recent call last):
  File "/Users/username/python/lesson4/python-minicamp-homework-4/venv/bin/flask", line 11, in <module>
    sys.exit(main())
  File "/Users/username/python/lesson4/python-minicamp-homework-4/venv/lib/python3.6/site-packages/flask/cli.py", line 507, in main
    cli.main(args=args, prog_name=name)
  File "/Users/username/python/lesson4/python-minicamp-homework-4/venv/lib/python3.6/site-packages/flask/cli.py", line 374, in main
    return AppGroup.main(self, *args, **kwargs)
  File "/Users/username/python/lesson4/python-minicamp-homework-4/venv/lib/python3.6/site-packages/click/core.py", line 697, in main
    rv = self.invoke(ctx)
  File "/Users/username/python/lesson4/python-minicamp-homework-4/venv/lib/python3.6/site-packages/click/core.py", line 1066, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/Users/username/python/lesson4/python-minicamp-homework-4/venv/lib/python3.6/site-packages/click/core.py", line 895, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/Users/username/python/lesson4/python-minicamp-homework-4/venv/lib/python3.6/site-packages/click/core.py", line 535, in invoke
    return callback(*args, **kwargs)
  File "/Users/username/python/lesson4/python-minicamp-homework-4/venv/lib/python3.6/site-packages/click/decorators.py", line 64, in new_func
    return ctx.invoke(f, obj, *args[1:], **kwargs)
  File "/Users/username/python/lesson4/python-minicamp-homework-4/venv/lib/python3.6/site-packages/click/core.py", line 535, in invoke
    return callback(*args, **kwargs)
  File "/Users/username/python/lesson4/python-minicamp-homework-4/venv/lib/python3.6/site-packages/flask/cli.py", line 432, in run_command
    use_debugger=debugger, threaded=with_threads)
  File "/Users/username/python/lesson4/python-minicamp-homework-4/venv/lib/python3.6/site-packages/werkzeug/serving.py", line 708, in run_simple
    inner()
  File "/Users/username/python/lesson4/python-minicamp-homework-4/venv/lib/python3.6/site-packages/werkzeug/serving.py", line 670, in inner
    fd=fd)
  File "/Users/username/python/lesson4/python-minicamp-homework-4/venv/lib/python3.6/site-packages/werkzeug/serving.py", line 564, in make_server
    passthrough_errors, ssl_context, fd=fd)
  File "/Users/username/python/lesson4/python-minicamp-homework-4/venv/lib/python3.6/site-packages/werkzeug/serving.py", line 474, in __init__
    socket.SOCK_STREAM)
  File "/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python3.6/socket.py", line 460, in fromfd
    nfd = dup(fd)
OSError: [Errno 9] Bad file descriptor

如果这是不正常的,我应该向烧瓶的人提交一份错误报告吗?

谢谢!

更新Pipskweak的建议,我修改了脚本:

代码语言:javascript
复制
from flask import Flask, render_template, request, jsonify
import sqlite3

app = Flask(__name__)

connection = sqlite3.connect('database.db')
connection.execute('CREATE TABLE IF NOT EXISTS films (title TEXT, rating INTEGER)')
connection.close()

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

@app.route('/movie', methods = ['POST'])
def add_movie_function():
    data = None
    try:
        connection  = sqlite3.connect('database.db')
        with connection:
            cursor      = connection.cursor()
            title       = request.form['title']
            rating      = request.form['rating']
            query   = 'INSERT INTO films (title, rating) VALUES (?, ?)'
            data = cursor.execute(query, (title, rating))
            connection.commit()
            message = 'Successfully inserted title and rating data into movies table!'
    except sqlite3.Error as e:
        if connection:
            connection.rollback()
            message = 'There was an issue with inserting data into the movies table :('
        raise ValueError('sqlite3: {}'.format(e))
    finally:
        if connection:
            connection.close()
            print(message)
        if data:
            print(data)
            return message

@app.route('/movies', methods = ['GET'])
def list_all_movies():
    data = None
    try:
        connection = sqlite3.connect('database.db')
        with connection:
            cursor = connection.cursor()
            data = cursor.execute('SELECT * FROM films')
            connection.commit()
            search_result = jsonify(cursor.fetchall())
    except sqlite3.Error as e:
        if connection:
            search_result = 'An error occured getting all the film titles'
        raise ValueError('sqlite3: {}'.format(e))
    finally:
        if connection:
            connection.close()
            print(search_result)
        if data:
            print(data)
            return search_result

app.run(debug = True)
# if __name__ == '__main__':
#     print('__name__ == "__main__"')
#     app.run(debug = True)

注意:使用if __name_ == ...不会在export FLASK_APP...flask run调用烧瓶时调用调试器模式。然而,将python3 scriptname.pyif name == main一起使用是否会调用调试器--所以我怀疑这里的烧瓶有什么问题吗?

我还调整了脚本,使其在python 2中运行(只有一对打印语句和except sqlite3.Error, e:语法),并尝试使用虚拟环境在Flask (使用调试器模式)中运行它,python脚本可以很好地处理html,当我退出Flask服务器时,没有OSError: Errno 9坏文件描述符。所以,这是我应该向酒瓶的人报告的错误吗?

FWIW:

代码语言:javascript
复制
$  pip freeze  
appdirs==1.4.3  
click==6.7  
Flask==0.12  
itsdangerous==0.24  
Jinja2==2.9.5  
MarkupSafe==1.0  
packaging==16.8  
pyparsing==2.2.0  
requests==2.13.0  
six==1.10.0  
Werkzeug==0.11.15

也许这也是一个类似的问题?

EN

回答 1

Stack Overflow用户

发布于 2017-03-09 01:25:45

因此,tryexceptfinally语句可能会导致一些问题。

你想试试这个吗?对于异常和关闭连接,它会更具体一些。

代码语言:javascript
复制
def query_db(sql_statement):
    try:
        # connect to database
        conn = sqlite3.connect('database.db')
        with conn:
            cur = conn.cursor()
            data = cur.execute(sql_statement)
            # commit the changes
            conn.commit()

    except sqlite3.Error, e:
        # if an error has occured, rollback the changes
        if conn:
            conn.rollback()

        # print the error out. Probably useful.
        raise ValueError('sqlite3: {}'.format(e))

    finally:
        # lastly, close the database, probably a good idea.
        if conn:
            conn.close()
        if data:
            return data

另外,您在if之前缺少了app.run()语句

代码语言:javascript
复制
if __name__ == "__main__":
    app.run(debug=True)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42681764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档