flask 加载模块问题

2015-11-23 10:49:40 +08:00
 honmaple
项目结构
├── app
│   ├── forms
│   │   ├── __init__.py
│   │   ├── login.py

│   ├── __init__.py

│   └── views
│   ├── admin.py
│   ├── blog.py
│   ├── book.py
│   ├── __init__.py

├── config
│   ├── default.py
│   ├── development.py
│   ├── __init__.py

## run.py 内容
```
from app import create_app

app = create_app()
if __name__ == '__main__':
app.run()
```
## app/__int__.py
```
def create_app():
app = Flask(__name__)
config = load_config()
app.config.from_object(config)

register_routes(app)
return app

def register_routes(app):
from .views import admin, blog, book
app.register_blueprint(admin.site, url_prefix='')
app.register_blueprint(blog.site, url_prefix='/blog')
app.register_blueprint(book.site, url_prefix='/book')
```
## views/blog.py
```
from flask_flatpages import FlatPages
from .. import create_app

site = Blueprint('blog',__name__)

app = create_app()
flatpages = FlatPages(app)
```
运行时出错
```
Traceback (most recent call last):
File "run.py", line 13, in <module>
app = create_app()
File "/home/honmaple/website/app/__init__.py", line 21, in create_app
register_routes(app)
File "/home/honmaple/website/app/__init__.py", line 29, in register_routes
from .views import admin, blog, book
File "/home/honmaple/website/app/views/blog.py", line 18, in <module>
app = create_app()
File "/home/honmaple/website/app/__init__.py", line 21, in create_app
register_routes(app)
File "/home/honmaple/website/app/__init__.py", line 29, in register_routes
from .views import admin, blog, book
ImportError: cannot import name 'blog'
```
### views/admin.py book.pyblog.py 不同的地方就是
```from .. import create_app```
还有我本机是 python3.5,服务器上是 python3.4,本机测试正常,服务器上运行出错,难道是版本的原因
3046 次点击
所在节点    Flask
16 条回复
honmaple
2015-11-23 10:52:57 +08:00
billion
2015-11-23 11:10:16 +08:00
每个文件夹下面的 init 文件,文件名前后都有两个下划线__init__.py
honmaple
2015-11-23 11:14:47 +08:00
@billion 这个有的,可能是没显示出来
yangtukun1412
2015-11-23 11:55:28 +08:00
循环引用了吧
cppgohan
2015-11-23 11:57:48 +08:00
lz 搞定了吗?

最近一年正职写 android, 偶尔写 python, 也都直接用完整包名的 import...

`from app.views import admin, blog, book`
honmaple
2015-11-23 12:13:29 +08:00
@yangtukun1412 什么意思?
honmaple
2015-11-23 12:15:26 +08:00
@cppgohan 还没搞定,本地测试是正常的,到了服务器上就出错了,唉,准备换个版本试试
chenkun0128
2015-11-23 12:45:41 +08:00
sys.path.insert(0, os.path.dirname(__file__)) ?_?
honmaple
2015-11-23 13:05:08 +08:00
原来的问题搞定了,
def register_routes(app):
from .views import admin, blog, book
app.register_blueprint(admin.site, url_prefix='')
app.register_blueprint(blog.site, url_prefix='/blog')
app.register_blueprint(book.site, url_prefix='/book')
改成
def register_routes(app):
from .views import admin, book
app.register_blueprint(admin.site, url_prefix='')
app.register_blueprint(book.site, url_prefix='/book')
from .views.blog import site
app.register_blueprint(site, url_prefix='/blog')
暂时可以运行了,不过数据库又出问题了,现在正在搞定数据库,
python 部署果然是个问题
florije
2015-11-23 13:15:03 +08:00
blog.py 中的 register_pages 这个循环引用了,然后楼主也是不遵循 pep8 啊……
# -*- coding=UTF-8 -*-一般放文件最开始位置,要跑起来 LZ 的应用也很费劲啊……
florije
2015-11-23 13:20:02 +08:00
不过明显看出来 LZ 的 django 的功底很深厚啊,写的代码还是很不错,而且不是用 IDE 写的,想必有 3+年的 python 经验了吧。
honmaple
2015-11-23 13:40:13 +08:00
@florije 额,别嘲讽我了,代码上还有很多重复工作没优化,不过我只有一年经验,刚入门 django 觉得 django 太大不自由就转 flask 了。。。话说你是怎么看出我不是用 IDE 写的(用的 vim)
honmaple
2015-11-23 13:44:15 +08:00
@florije 问一下上个问题,我将
register_routes(app)
register_assets(app)
register_db(app)
register_jinja2(app)
写到函数外是不是就没有循环引用了
florije
2015-11-23 13:49:11 +08:00
@honmaple 没有想到是 vim ,只是想是类似的比如说 sublime 的工具,因为很多代码没有格式化(ps ,一般 IDE 都带这种功能,起码我让小伙伴提交前都必须 reformat 一下),这种就是顺序问题,看报错里面也能看出来端倪,就是报了两次 register_routes(app)这个错误。这个没有详细看代码就是看了报错提示的两个文件,简单分析了下。
gevin
2015-11-24 08:30:57 +08:00
我也在用 flask 写博客系统,我们可以交流一下

https://github.com/flyhigher139/OctBlog
honmaple
2015-11-29 15:58:54 +08:00
@gevin 好的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/238187

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX