【问题标题】:Flask AttributeError: 'NoneType' object has no attribute 'request'Flask AttributeError:“NoneType”对象没有属性“请求”
【发布时间】:2011-12-25 10:00:45
【问题描述】:

我的代码:

#!/bin/python
import os,sys
from datetime import datetime
from flask import Flask
from database import db_session,init_db
from models import Node

version = '0.1'
app = Flask(__name__)

@app.route("/")
def index():
    return "hello"

@app.route("/add")
def add():
    node = Node('test','test','this is a test',1)
    db_session.add(node)
    db_session.commit()
    return 'is ok'

@app.teardown_request
def shutdown_session(exception=None):
    print "Teardown 1 {0!r}".format(exception)
    db_session.remove()


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

我的models.py,这是一个简单的模型,只是一个节点

from sqlalchemy import Column,Integer,String,Text
from database import Base

class Node(Base):
    __tablename__ = 'nodes'

    id = Column(Integer, primary_key=True)
    title = Column(String(300))
    tagnames = Column(String(125))
    body = Column(Text())
    nodetype=Column('node_type',Integer(11))

    def __init__(self,title=None,tagnames=None,body=None,nodetype=0):
        self.title = title
        self.tagnames = tagnames
        self.body = body
        self.nodetype = nodetype

    def __repr__(self):
        return '<Node %r>' % (self.title)

我的database.py,我没有使用flask-sqlalchemy

from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base


engine = create_engine('mysql://root:123456@127.0.0.1:3306/test', echo=True,convert_unicode=True)
db_session = scoped_session(sessionmaker(autocommit=False,autoflush=False,bind=engine))

Base = declarative_base()
Base.query = db_session.query_property()

def init_db():
    import flaskq.models
    Base.metadata.create_all(bind=engine,checkfirst=True)

当我第一次请求“http://127.0.0.1:5000/add”时 此代码抛出: AttributeError: 'NoneType' 对象没有属性 'request'

再次请求,一切正常。

【问题讨论】:

标签: python flask


【解决方案1】:

显然您缺少一个应该具有请求属性的对象。有可能在您的添加方法中的某处需要对请求对象/上下文的引用。 (这真的是整个错误报告吗?部分错误报告很少有用!)我猜你在这里使用 django 库,也许Flask with SQLite3-Example 可能对你有用。通过 teardown_request 会自动建立请求上下文,这可能是它在第一次调用时失败的原因。

根据Context-Locals,有时需要明确的请求上下文(无论这意味着什么我无法详细解释)也许以下会有所帮助:

from flask import request

... 
def add():
   with app.request_context(environ):
      node = Node('test','test','this is a test',1)
      db_session.add(node)
      db_session.commit()
      return 'is ok'

【讨论】:

  • database.db_db_session,database,init_db 是flask-sqlaclhemy pyi 包吗?什么是models.Node?您仍然忽略了重要信息。这样我们就无能为力了。我怀疑你暂时会通过这种方式获得任何有用的 cmets。
  • 我自己没有使用 Flask,也无法确定,但似乎您必须在某些条件下建立明确的请求上下文。您可以通过以下方式找到理解:flask.pocoo.org/docs/quickstart/#context-locals。由于格式,我将其余部分添加到我的主要答案中!
【解决方案2】:

与 Don Question 不同,您不应该自己设置上下文。当你连接到它时,Flask 应该这样做。假设您使用浏览器访问/add,您应该不会遇到问题。

您是通过编程方式连接还是使用浏览器?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-29
    • 2020-06-25
    • 2021-12-26
    • 2022-11-28
    • 2017-04-26
    • 2015-06-12
    • 2020-01-25
    • 1970-01-01
    相关资源
    最近更新 更多