2011-12-25 41 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,則不應該遇到您遇到的問題。

你編程連接或使用瀏覽器?

相關問題