2012-03-08 2 views
1

Djangoが表示機能に到着しないので、無限のチェックをしていると思います。このURLパターンはDjangoで無限の検査をどのようにしますか?

# CodeBundles 
url(r"^cb/create/$", 'codebundle_create', name="codebundle_create"), 
url(r"^cb/details/(?P<cbid>\w+)/$", 'script', name="codebundle_details"), 
url(r"^cb/(?P<cbid>\w+)$", 'codebundle_browser', name="codebundle_browser"), 
url(r"^cb/(?P<cbid>\w+)/(?P<path>\w+)$", 'codebundle_browser', name="codebundle_browser"), 

#### url(r"^cb/(?P<cbid>\w+)/(?P<path>(.|\W|\w)+)/delete/$", "deletefile", name="deletefile"), 

url(r"^cb/newfile/$", 'codebundle_newfile', name="codebundle_newfile"), 
url(r"^cb/newfolder/$", 'codebundle_newfolder', name="codebundle_newfolder"), 
url(r"^cb/build_history/(?P<cbid>\w+)/$", 'codebundle_build_history', name="codebundle_build_history"), 
url(r"^cb/run_history/(?P<cbid>\w+)/$", 'codebundle_run_history', name="codebundle_run_history"), 

注目される男は殺人者です。

私はそのURLパターンを有効にしたときに502 Bad Gatewayを取得します。理由はわかりません。

DjangoのメインURL:私はcodebundle_browserページに得れば、私はcodebundle_browserに行くhttp://192.168.1.138/natrium/

、どちらかのURLが細かい

http://192.168.1.138/natrium/cb/12343 
http://192.168.1.138/natrium/cb/12343/./ABC 

に動作します、私はbuild_historyをクリックすることができ、その後、私は502 Bad Gatewayで終わります。

だからdeletefile URLパターンが無限の検査を引き起こしていますか?要求URLが

http://192.168.1.138/natrium/cb/build_history/12343/ 

おかげである場合でも、build_historyは異なるURLパターンで、Djangoはbuild_historyに行くには十分にスマートではありません。

+1

なぜあなたは '使用しないにRESTfulなURIの設計目標を追跡することをお勧めいたします|。\ W | \ w'た基本的な手段:任意の記号または文字または文字ではない。たぶんこれはregexpで何らかの深い再帰を引き起こしますか? –

+0

削除には '。/ directory'、'/hello'、 'abc.py'などのようなケース(パス)が必要です。 - _ 1 A z 'が表示されることがあります。本当に良いregxライターではありません。私は優先順位が動作すると思う(下に移動削除)。より良いregxがありますか?ありがとう。なぜ 'cb/build_history'がマッチしないのかよく分かりません。明らかに、 'cb/build_history /'は 'cb/1234'ではなく(1234は捕捉された値です)、' {%url codebundle_build_history cbid%} 'を呼び出しています。 – CppLearner

答えて

1

問題は正規表現を正しく使用していないことです。

ここでは、Pythonで正規表現についてのドキュメントを見つけることができます。このようなhttp://docs.python.org/library/re.html

ルール:

url(r"^cb/(?P<cbid>\w+)$", 'codebundle_browser', name="codebundle_browser"), 
url(r"^cb/newfile/$", 'codebundle_newfile', name="codebundle_newfile"), 

は基本的にオーバーラップし、\w+newfileを意味することができますので。 (それはおそらく余分/をここに重ならないが、DjangoはURLの最後に/を追加する規則を使用しています)

IDS(番号)の場合、あなたは数字だけ(任意の桁1回以上)一致する(?P<cbid>\d+)を使用する必要があります。 はあなたが.+(任意のシンボル1回以上)

を使用することができます間何のために私はまた、http://redrata.com/restful-uri-design/

+0

ありがとうございます。残念なことに、 'cbid'は普通の数字ではありません。それは数字と文字とのハッシュ値のミックスですので、強制的に '\ w +'を使用します。ですから、キラーの表現では、「ドット、非文字、または文字のkleen plusと一致する」と言っているのは、まったくダミーな方法です... – CppLearner

+0

'。+'私は 'アルファベット以外の文字と一致しません。それは今働く。間違いを指摘してくれてありがとう。 – CppLearner

関連する問題