1

これは Python/Flask の質問です。

更新: 今朝、気分が悪くて目が覚めました。Flask は、ソース コードでこれらのグロテスクな href を作成していません。実行中にプリペンドが行われています。リンクの上にマウスを置いたときに表示されるリンク アドレスを見てきました。今日、生成されたソースでそれらをチェックしましたが、生成したとおりに問題ありません。

では、私の質問は次のとおりです。あるプロジェクトから次のプロジェクトに移動するときに、ランタイム プロセスが何らかのフローティング ベース URL を構築するのはなぜですか? これをオフにするにはどうすればよいですか? または、Flask に元のルート アプリケーション ディレクトリにリセットするように指示しますか?

= = = = =

関連する Web ページへの参照を含む Web ページを生成しようとしています。ページはツリー状の構造で編成されており、すべてのプロジェクトが 1 つのレベルにあり、各プロジェクトの下に複数のページがあります。表示されている各ページについて、すべてのプロジェクトと各プロジェクトの下のすべてのページを一覧表示するサイドバーを、表示されている各ページへのリンクとともに表示したいと考えています。

私の views.py プログラムは次のように設定されています。

@app.route('/')
@app.route('/abc')
@app.route('/abc/<projectName>')
@app.route('/abc/<projectName>/<pageName>')
@app.route('/<projectName>/<pageName>')
def abc_pages(projectName=None, pageName=None):
.
. [includes creating anchor tags]
.

私の問題は、URL に projectName と pageName の両方が含まれている場合、作成したアンカー タグの先頭に projectName が追加されることです。例として、「example.com:5000/abc/projectA」のように projectName のみの URL を使用して、デフォルトのページにアクセスできます。そのページでは、生成されたアンカー タグは、"example.com:5000/abc/projectB/page_b2" のような href で期待どおりです。

しかし、"example.com:5000/abc/projectA/page_a1" のように projectName と pageName の両方を含む URL を使用してページにアクセスすると、アンカー (前と同じように生成されます) は次のようになります: "example.com:5000 /abc/projectA/projectB/page_b2".

長く苛立たしい検索を行った後、解決策が見つかりませんでした。私はそれを試してみて、問題のある projectName を次のように削除しました。

@app.route('/')
@app.route('/abc')
@app.route('/abc/<projectName>')
@app.route('/abc/<projectName>/<pageName>')
@app.route('/<projectName>/<pageName>')
@app.route('/abc/<noName>/<projectName>/<pageName>') <<--- new code here
def abc_pages(noName=None, projectName=None, pageName=None):
.
. [includes creating anchor tags]
.

喜びはありません。それは、問題の 1 回の繰り返しだけで済みます。不正な形式の「example.com:5000/abc/projectA/projectB/page_b2」をクリックできますが、生成された page_b2 のアンカー タグは「example.com:5000/abc/projectA/projectB/ProjectC/page_c3」のようになります。

したがって、私の質問は、生成されたアンカー タグがこの履歴を取得する理由です (ただし、projectName の履歴のみ)。毎回同じアンカー タグのコードを生成していますが、href は拡張し続けます。

4

1 に答える 1

1

リンクを生成する Flask フレンドリーな方法は、url_forを使用することです。これにより、ルートがどのように構築されているかを知る必要がなくなるためです。

例:

link = url_for("abc_pages", projectName = "project_B", pageName = "page_B2")

この方法でリンクを生成すれば、心配する必要はありません。リンクは常に正しいものになります。また、後でルートを変更することにした場合、ルートurl_forも自動的に更新されます。

とはいえ、手動で生成したルートで発生する問題は、ルートを/. で始まらないリンク/は、ブラウザのアドレス バーに表示される URL に対して相対的です。たとえば、ブラウザが に/project_Aあり、ブラウザへのリンクがある場合、ブラウザはproject_B/page_B2これら 2 つを連結して に移動し/project_A/project_B/page_B2ます。代わりに、/project_B/page_B2これは絶対 URL であるため、リンクを記述した場合、ブラウザは古いパスを捨てて、これを新しい URL として使用します。

于 2013-08-04T16:57:25.207 に答える