2012-12-13 5 views
2

저는 분석 팀을 위해 작은 웹 앱을 만들려고합니다. 그들은 단지 작성한 쿼리를 추가하고 볼 수있는 저장소가 필요합니다.플라스크 적용에서 클래스 가져 오기에 문제가 발생했습니다.

뷰/클래스에서 함수를 가져올 수 없기 때문에 지금까지 앱을 구현할 수 없었습니다. 누군가 내 문제가 무엇인지 파악할 수 있습니까?

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 

은 시간이 지남에, 당신이 배울 방법을 추상적 인 툴이 문제를 방지하는 방식으로,하지만 그 동안, 단순히 모듈 레벨에서 두지 말고 getpost 함수 내부로 라인 from queries_Final2 import get_db을 이동하여 해결할 수 있습니다.