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

その問題は、各ファイルを他のファイルにインポートしようとするという事実に関係していると思います。ただし、これを行う他の方法はわかりません。

これが私のコードです:

query_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')

どんなアイデアでも大歓迎です。前もって感謝します。

4

1 に答える 1

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

于 2012-12-13T19:04:19.940 に答える