python新手,最近使用flask做web应用时,发现个奇怪的问题。
在wsgiapp.py文件中启动flask的web应用,启动前先初始化了全局数据库对象(在另一个db.py文件中),其他蓝图中url处理函数再访问该全局数据库对象,db模块中的engine为None,需要重新初始化一次才能访问数据库。
但是定义在wsgiappp.py的路由函数却能直接访问数据库(也就是已经初始化过),后来尝试在两个地方print hash(db),发现结果不同。
这是什么原因,明明import的是同一个模块。记得之前用自己写的wsgi函数的话,没有这种问题的,flask 在调用run()函数启动webapp后有什么特别的操作吗?
我的python版本是2.7.9
贴下几个主要代码
wsgiapp.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from flask import Flask, render_template
from www.api import api_urls
from mvc import db
app = Flask(__name__)
app.config.from_object('config.config')
app.register_blueprint(api_urls.api_bp)
#init db
db.create_engine('dbuser', 'dbpasswd', 'dbname')
@app.route('/')
def index():
return render_template('index.html')
@app.route('/test')
def test():
print hash(db) #与api_urls.py的hash结果不同
print hash(db.engine) #db.engine不为None
return render_template('test.html')
if __name__ == '__main__':
app.run()
api_urls.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from flask import Blueprint, render_template, request, jsonify
from www.mvc import db
api_bp = Blueprint('api_bp', __name__)
#不再初始化一次数据库则不能访问
# db.create_engine('dbuser', 'dbpasswd', 'dbname')
@api_bp.route('/blogs')
def blogs_list():
print hash(db) #与wsgiapp.py的hash结果不同
print hash(db.engine) #不在文件中初始化的话,db.engine为None
return 'blogs'
db.py用的是廖雪峰老师python博客教程里的db.py
项目结构大致这样:
└─www
├─api --->api_urls.py
├─config
├─mvc --->db.py
└─wsgiapp.py
第一次碰到这种坑,找了半天资料无果,不知道大家以前有没有碰到类似的问题?
thanks in advance :)
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.