2012-12-13 31 views
2

我正在嘗試爲我的分析師團隊構建一個小型Web應用程序。他們只需要一個存儲庫,他們可以添加並查看他們編寫的查詢。燒瓶應用程序中的類導入問題

到目前爲止,我一直無法實現我的應用程序,因爲我無法跨視圖/類導入函數。有人能幫我弄清楚我的問題是什麼嗎?

我收到此錯誤:

File "C:\Users\Intern2\PycharmProjects\queries-Final2\queries_Final2.py", line 12, in <module> 
from search_queries import SearchQueries 
ImportError: cannot import name SearchQueries 

我認爲這個問題是與事實,我儘量給每個文件導入到另一個文件做。但是,我不知道有任何其他方式來做到這一點。

這裏是我的代碼:

queries_Final2.py(主應用程序文件)

from __future__ import with_statement 
from sqlite3 import dbapi2 as sqlite3 
from flask import Flask, request, session, g, redirect, url_for, abort,\ 
render_template, flash, _app_ctx_stack 
import flask 
import settings 
import functools 

# Views 
from main import Main 
from login import Login 
from search_queries import SearchQueries 
from add_queries import AddQueries 
from edit_queries import EditQueries 

DATABASE = 'C:\\Users\\Intern2\\PycharmProjects\\queries-Final2\\queriesDB.db' 

app = flask.Flask(__name__) 
app.config.from_object(__name__) 
app.config.from_envvar('FLASKR_SETTINGS', silent=True) 
app.secret_key = settings.secret_key 

app.add_url_rule('/search-queries/', 
view_func=SearchQueries.as_view('search-queries'), 
methods=["GET", "POST"]) 

app.add_url_rule('/add-queries/', 
view_func=AddQueries.as_view('add-queries'), 
methods=["GET", "POST"]) 

def init_db(): 
"""Creates the database tables.""" 
with app.app_context(): 
    db = get_db() 
    with app.open_resource('schema.sql') as f: 
     db.cursor().executescript(f.read()) 
    db.commit() 

def get_db(): 
"""Opens a new database connection if there is none yet for the 
current application context. 
""" 
    top = _app_ctx_stack.top 
    if not hasattr(top, 'sqlite_db'): 
     top.sqlite_db = sqlite3.connect(app.config['DATABASE']) 
    return top.sqlite_db 

顯示查詢查看/類

from __future__ import with_statement 
from sqlite3 import dbapi2 as sqlite3 
from flask import Flask, request, session, g, redirect, url_for, abort,\ 
render_template, flash, _app_ctx_stack 
import flask 
import settings 
import functools 
from queries_Final2 import get_db 
import utils 

class SearchQueries(flask.views.MethodView): 
    @utils.login_required 
def get(self): 
    db = get_db() 
    cur = db.execute('select title, columns, query, notes, tags from entries order by id desc') 
    entries = [dict(title=row[0], columns=row[1], query=row[2],notes=row[3],tags=row[4]) for row in cur.fetchall()] 
    return render_template('search-queries.html', entries=entries) 

添加查詢類/圖

from __future__ import with_statement 
from flask import Flask, request, session, g, redirect, url_for, abort,\ 
render_template, flash, _app_ctx_stack 
import flask 
import functools 
import utils 
from queries_Final2 import get_db 

class AddQueries(flask.views.MethodView): 
    @utils.login_required 
def get(self): 
    return flask.render_template('add-queries.html') 

def post(self): 
    db = get_db() 
    db.execute('insert into entries (title, columns, query, notes, tags) values (?, ?, ?, ?, ?)', 
    [request.form['title'], 
    request.form['columns'], 
    request.form['query'], 
    request.form['notes'], 
    request.form['tags'] 
    ]) 
    db.commit() 
    flash('New entry was successfully posted') 
    return flask.render_template('search-queries.html') 

任何想法將不勝感激。提前致謝。

+0

這是否最終解決了您的問題? – orokusaki

+0

不幸的是,它沒有。我最終只是將模塊放在我的主.py文件中,這就好了。但是,我希望能讓我的設計更有條理。 –

回答

3

您有一個由from queries_Final2 import get_db觸發的循環導入。

你這樣做,有效的(僞代碼):

# Inside module A 
import x from module B 
    -> goes to module B to get x 
    -> module B begins loading its imports (happens on first import) 
    -> module B imports y from module A 
    -> module B fails to import y from module A because module A is still being defined 

隨着時間的推移,你將學習如何抽象的工具的方式,將避免這個問題,但在此期間,您只需將from queries_Final2 import get_db行移動到getpost函數中,而不是將它們留在模塊級別,即可修復它。