2011-12-25 50 views
4

我的代码:瓶AttributeError的: 'NoneType' 对象有没有属性 '要求'

#!/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) 

我的数据库。 PY,我不使用烧瓶-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:[email protected]: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” 此代码救援人员到场ws: AttributeError:'NoneType'对象没有任何属性'请求'

再次请求,每件事情都可以。

+2

是否有堆栈跟踪? – 2011-12-25 10:09:48

+0

http://paste.pocoo.org/show/ak3t10kAazgovWHrIUgV/ – losingle 2011-12-25 13:16:46

回答

2

很显然,你没有一个对象,它应该有一个请求属性。有可能,在你的add-method的某个地方,你需要引用request-object/context。 (这是否真的是整个错误报告?部分错误 - Reporst很少有用!)我想你在这里使用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' 
+0

我使用sqlalchemy – losingle 2011-12-25 11:26:50

+0

database.db_db_session,database,init_db是flask-sqlaclhemy pyi包吗?和什么模型。节点?您仍在省略重要信息。这样我们无法帮助。我怀疑你暂时会以这种方式得到任何有用的评论。 – 2011-12-25 13:19:15

+0

我添加了一些总结,谢谢 – losingle 2011-12-25 13:42:25

2

相反唐问题,你不应该自己设置背景。当连接到它时,Flask应该这样做。假设您使用浏览器访问/add,则不应该遇到您遇到的问题。

你编程连接或使用浏览器?

相关问题