Flask 属性错误:'NoneType' 对象没有 'request' 属性
我的代码:
#!/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,里面是一个简单的模型,只是一个节点(Node)。
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' 这个属性。
但再请求一次,所有东西都正常了。
2 个回答
2
跟Don Question说的相反,你不需要自己去设置一个上下文。Flask在你连接的时候会自动处理这个。假设你是通过浏览器访问/add
,那么你应该不会遇到你现在的问题。
你是通过编程的方式连接,还是用浏览器连接的呢?
2
显然,你缺少一个应该有请求属性的对象。可能在你的添加方法中,需要引用请求对象或上下文。(这真的是完整的错误报告吗?部分错误报告通常没什么用!) 我猜你在这里使用的是Django库,也许 Flask与SQLite3的示例 对你会有帮助。在teardown_request中,请求上下文会自动建立,这可能就是它在第一次调用时失败的原因。
根据 上下文局部变量 的说明,有时需要一个明确的请求上下文(具体是什么意思我也解释不清),也许下面的内容会对你有帮助:
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'