1

私はSEOに適したURLでブログアプリを書いています。無効なURLにアクセスすると、次のエラーが発生します。

UnboundLocalError:割り当て前に参照されるローカル変数'path'

有効なURLは正常に機能します。

コードは次のとおりです。

class ViewPost(BaseHandler):
    def get(self, slug):
        post = Posts.all()
        post.filter('path =', slug)
        results = post.fetch(1)
        for post in results:
            path = post.path
        if path == slug:
            self.render_template('post.html', {'post':post})
        else:
            self.response.out.write('no post with this slug')

エラーのない有効な例と、エラーをスローする無効な例を次に示します。無効な例で完全なスタックトレースを確認できます。

完全なコードはgithubの62行目にあります。

前もって感謝します。私はPythonを初めて使用するので、あなたの助けとフィードバックに本当に感謝しています。

アップデート

  1. コンテキストとして、2つの文字列を比較して、提供するコンテンツがあるかどうかを判断しています。

  2. 私が期待するもの:スラッグとパスが等しい場合、テンプレートをレンダリングする必要があります。等しくない場合:「このスラッグで投稿なし」メッセージで応答することになっています。

  3. 私がした他のこと。

    • スラッグとパスの値を取得することを確認しました。

    • このようにアイデンティティを変えてみました。

これにより、エラーが発生しなくなりますが、else応答が返されません。代わりに、ビューソースに何もない空白のページが表示されます。

class ViewPost(BaseHandler):
def get(self, slug):
    post = Posts.all()
    post.filter('path =', slug)
    results = post.fetch(1)
    for post in results:
        path = post.path
        if path == slug:
            self.render_template('post.html', {'post':post})
        else:
            self.response.out.write('no post with this slug')
4

1 に答える 1

1

このバージョンのコードでは、forループが入力されていないため、空白のページが表示されます。スラッグが無効であるため、結果はnullまたは空になります。その結果、ifステートメントに到達することはありません。つまり、ifもelseもまったく起動しません。

class ViewPost(BaseHandler):
def get(self, slug):
    post = Posts.all()
    post.filter('path =', slug)
    results = post.fetch(1)
    for post in results:
        path = post.path
        if path == slug:
            self.render_template('post.html', {'post':post})
        else:
            self.response.out.write('no post with this slug')

この例では、スラグに関係なく、常にifステートメントに到達するようにインデントが設定されています。ただし、上記の例のように、結果は空またはnullのいずれかです。forループが実行されることはありません。つまり、パス変数が設定されることはありません。

class ViewPost(BaseHandler):
    def get(self, slug):
        post = Posts.all()
        post.filter('path =', slug)
        results = post.fetch(1)
        for post in results:
            path = post.path
        if path == slug:
            self.render_template('post.html', {'post':post})
        else:
            self.response.out.write('no post with this slug')

もちろん、これにより、次の比較が試行されると、次のエラーメッセージが表示されますpath == slug

UnboundLocalError:割り当て前に参照されるローカル変数'path'

基本的に、この問題を解決するには、パスを値で初期化して、割り当てなしで参照されないようにする必要があります。パスをスラッグとは異なることが保証されているデフォルト値に設定します。スラッグが有効なレコードにつながらない場合は、elseが起動します。

解決:

`path ='none``を使用した例と、ifステートメントに常に到達するようにインデントを設定します。

class ViewPost(BaseHandler):
    def get(self, slug):
        path = 'none'
        post = Posts.all()
        post.filter('path =', slug)
        results = post.fetch(1)
        for post in results:
            path = post.path
        if path == slug:
            self.render_template('post.html', {'post':post})
        else:
            self.response.out.write('no post with this slug')
于 2012-05-18T07:35:30.387 に答える