2016-02-25 53 views
0

我使用Django作爲RESTful API,和我有一樣的URL url(r'^datavore/(?P<configuration>.*)/(?P<dataset>.*)/(?P<varname>.*)/(?P<region>[a-z-A-Z\_]+)/(?P<date_range>.*)/filelist/$', views.filelist,name="filelist"),大幅削減參數的Django

我的問題是,當這些數據參數包含「/」它改變我的網址的所有制結構數據集參數只包含/之後的字符串。任何想法如何解決這個問題?

+0

在調用端用其編碼值('%2F')代替斜線可能會起作用,但我不確定URL匹配是在解碼URL之前還是之後完成的。最好的答案可能是避免使用可能包含文字斜槓的URL參數。您也可以將其從GET更改爲POST。 –

+0

我測試了%2F,但它不工作,我不能真正改變/因爲這是它的索引,我想也許我應該在客戶端以base64格式編碼參數 – azelix

回答

1

如果只有一個參數可以有斜線,那麼通過指定正則表達式可以解決您的問題,其中只有一個捕獲組被允許斜線。例如:

^datavore/(?P<configuration>[\w\d\.\-_]+)/(?P<dataset>.*)/(?P<varname>[\w\d\.\-_]+)/(?P<region>[a-z-A-Z\_]+)/(?P<date_range>[\w\d\.\-_]+)/filelist/$ 

datavore/some-config/dataset/subdataset/varname/region/date-range/filelist/將導致下一個值匹配的組:

datavore/some-config/dataset/subdataset/varname/region/date-range/filelist/ 
144 steps to match 

configuration [9-20] `some-config` 
dataset [21-39] `dataset/subdataset` 
varname [40-47] `varname` 
region [48-54] `region` 
date_range [55-65] `date-range` 

如果幾組能對他們有斜槓則沒有準確的方法來正確地匹配他們使用額外的文本withou路徑。有額外的文本示例解決路徑:

^datavore/__conf__/(?P<configuration>.*)/__dataset__/(?P<dataset>.*)/__varname__/(?P<varname>.*)/__region__/(?P<region>[a-z-A-Z\_]+)/__date_range__/(?P<date_range>.*)/filelist/$ 
670 steps to match 
datavore/__conf__/conf/subconf/__dataset__/dataset/subdataset/__varname__/varname/subvarname/__region__/region/__date_range__/date-range/filelist/ 

configuration [18-30] `conf/subconf` 
dataset [43-61] `dataset/subdataset` 
varname [74-92] `varname/subvarname` 
region [104-110] `region` 
date_range [126-136] `date-range` 

注意/__dataset__/是使用的,而不是簡單的dataset您可能需要用戶具有價值的數據集至極開始與dataset本身。這將導致問題:

^datavore/conf/(?P<configuration>.*)/dataset/(?P<dataset>.*)/varname/(?P<varname>.*)/region/(?P<region>[a-z-A-Z\_]+)/date_range/(?P<date_range>.*)/filelist/$ 
datavore/conf/conf-val/dataset/dataset/dataset-val/varname/varname-val/subvarname-val/region/region-val/date_range/date-range-val/filelist/ 

654 steps to match 

configuration [14-30] `conf-val/dataset` // THIS SEEMS TO BE WRONG. We wanted this to be `conf-val` 
dataset [39-50] `dataset-val` // THIS SEEMS TO BE WRONG. We wanted this to be `dataset/dataset-val` 
varname [59-85] `varname-val/subvarname-val` 
region [93-103] `region-val` 
date_range [115-129] `date-range-val` 

實際的解決方案高度依賴於可能的值的捕獲組

如果您正在使用此路徑作爲API端點那麼我建議你只是轉儲這種做法,使用GET參數代替

+0

P.S.嘗試使用一些在線正則表達式解釋器,如:https://regex101.com/#python – imposeren

+0

使用正則表達式,其中捕獲組不允許使用正斜槓的速度比正則表達式快3.5倍(41步而不是144次)組。使用正則表達式,允許所有組有斜線的速度比使用沒有斜線的組慢16倍左右(匹配670步)。如果切換到GET查詢參數,則不會使用正則表達式。 – imposeren

+0

「不會使用正則表達式」是錯誤的:url仍然應該匹配。但匹配簡單表達式比如'^ datavore/filelist/$' – imposeren

0

您必須在參數之間使用與內部參數不同的分隔符。參數匹配後,您總是可以用實際上應該存在參數中的斜槓替換該分隔符。

因此,無論是那些使用斜線的參數,內部都允許其他安全字符,如短劃線或點(意味着由於各個參數的性質而導致不能出現其他字符),或者您有決定一些分隔符並創建一些轉義規則。