烧瓶项目结构变化

时间:2015-01-22 16:37:54

标签: python flask sqlalchemy

您好我已经完成了Flask / Flask-SqlAlchemy应用程序正常工作,但我想根据以下内容重新组织其结构:

http://flask.pocoo.org/docs/0.10/patterns/packages/

我的工作项目具有以下结构和文件:

folder:monkeyMeRoundTwo:
    -app.py
    -config.py
    -models.py
    -monkeyDB.db
    -app_test.py
    folder:templates: 
         -edit.html
         -friends.html
         -layout.html
         -login.html
         -myProfile.html
         -profile.html
         -register.html
         -users.html
     folder:static:
          folder:css
          folder:images

我的app.py文件:

from flask import Flask, render_template, redirect, \
    url_for, request, session, flash

from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)

# local
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///monkeyDB.db'

# heroku
#import os
app.config.from_object('config.BaseConfig')

#app.config.from_object(os.environ['APP_SETTINGS'])

db = SQLAlchemy(app)

from models import *

@app.route('/')
def index():
    if not session.get('logged_in'):
        return render_template('login.html')
    else:
        return redirect(url_for('friendList'))

.......rest of views


if __name__ == '__main__':
    app.run(debug=True)

我的config.py文件:

import os

class BaseConfig(object): 
  SECRET_KEY = "kjdsbfkjgdf78sft"

我的models.py文件:

from app import db
from sqlalchemy.orm import relationship, backref
from sqlalchemy import Table, Column, Integer, ForeignKey
from sqlalchemy.ext.declarative import declarative_base

class users(db.Model):

    __tablename__ = "Users"

    id = db.Column(db.Integer, primary_key=True)
    userName = db.Column(db.String, nullable=False)
    userEmail = db.Column(db.String, nullable=False)
    userPhone = db.Column(db.String, nullable=False)
    userPass = db.Column(db.String, nullable=False)

    def __init__(self, userName, userEmail, userPhone, userPass):

        self.userName = userName
        self.userEmail = userEmail
        self.userPhone = userPhone
        self.userPass = userPass

    def __repr__(self):
        return '{}-{}-{}-{}'.format(self.id, self.userName, self.userEmail, self.userPhone)


class friendships(db.Model):

    __tablename__ = "Friendships"

    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('Users.id'), nullable=False)
    friend_id = db.Column(db.Integer, db.ForeignKey('Users.id'), nullable=False)

    userR = db.relationship('users', foreign_keys='friendships.user_id')
    friendR = db.relationship('users', foreign_keys='friendships.friend_id')

    def __init__(self, user_id, friend_id):

        self.user_id = user_id
        self.friend_id = friend_id  

    def __repr__(self):
        return '{}-{}-{}-{}'.format(self.user_id, self.friend_id)


class bestFriends(db.Model):

    __tablename__ = "BestFriends"

    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('Users.id'), nullable=False)
    best_friend_id = db.Column(db.Integer, db.ForeignKey('Users.id'), nullable=False)

    user = db.relationship('users', foreign_keys='bestFriends.user_id')
    best_friend = db.relationship('users', foreign_keys='bestFriends.best_friend_id')

    def __init__(self, user_id, best_friend_id):

        self.user_id = user_id
        self.best_friend_id = best_friend_id

    def __repr__(self):
        return '{}-{}-{}-{}'.format(self.user_id, self.best_friend_id)

我的app_tests.py文件:

import os
import app
import unittest
import tempfile   

class AppTestCase(unittest.TestCase):

    def setUp(self):
        self.db_fd, app.app.config['DATABASE'] = tempfile.mkstemp()
        app.app.config['TESTING'] = True
        self.app = app.app.test_client()

    def tearDown(self):
        os.close(self.db_fd)
        os.unlink(app.app.config['DATABASE'])

    def test_index_page(self):
        rv = self.app.get('/')
        assert 'Friends' in rv.data

...........rest of tests


if __name__ == '__main__':
    unittest.main()

正如我所提到的,一切正常,测试通过即可,但是当我尝试按照示例时:

http://flask.pocoo.org/docs/0.10/patterns/packages/

并将项目更改为以下结构:

结构/组织:

folder:monkeyMeRT:
        -runserver.py
        folder:monkeyMeRT:
              -__init__.py
              -views.py
              -config.py
              -models.py
              -monkeyDB.db
              -app_test.py
              folder:templates: 
                   -edit.html
                   -friends.html
                   -layout.html
                   -login.html
                   -myProfile.html
                   -profile.html
                   -register.html
                   -users.html
              folder:static:
                   folder:css
                   folder:images

runserver.py文件:

from monkeyMeRT import app
app.run(debug=True)

init .py文件:

from flask import Flask, render_template, redirect, \
    url_for, request, session, flash

from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)

# local
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///monkeyDB.db'

# heroku
#import os
app.config.from_object('config.BaseConfig')

#app.config.from_object(os.environ['APP_SETTINGS'])

db = SQLAlchemy(app)

from models import *

import monkeyMeRT.views

views.py文件:

from monkeyMeRT import app

.......here go all the views/functions

models.py文件:

from monkeyMeRT import db
from sqlalchemy.orm import relationship, backref
from sqlalchemy import Table, Column, Integer, ForeignKey
from sqlalchemy.ext.declarative import declarative_base

........here go the db classes

config.py文件:

import os

class BaseConfig(object): 
  SECRET_KEY = "kjdsbfkjgdf78sft"

更改后我最终会出错。

Traceback (most recent call last):
  File "__init__.py", line 19, in <module>
    from models import *
  File "/Users/alex/Desktop/PY/monkeyMeRT/monkeyMeRT/models.py", line 1, in <module>
    from monkeyMeRT import db
ImportError: No module named monkeyMeRT

我想我还没有正确地解释这个例子。任何人都可以帮我解决这个问题我是Flask的新手(一个月前开始学习),并希望通过配置和视图分离项目的高效设置,例如: http://flask.pocoo.org/docs/0.10/patterns/packages/

非常感谢帮助! 提前谢谢。

1 个答案:

答案 0 :(得分:0)

回溯告诉你monkeyMeRT不是一个包。解决这个问题:

  1. 请务必将项目文件夹命名为monkeyMeRT
  2. monkeyMeRT需要包含名为__init__.py
  3. 的文件

    该init文件不必包含任何内容,只需要存在,以便Python知道将该目录视为Python包。