2016-02-25 51 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

您必须在参数之间使用与内部参数不同的分隔符。参数匹配后,您总是可以用实际上应该存在参数中的斜杠替换该分隔符。

因此,无论是那些使用斜线的参数,内部都允许其他安全字符,如短划线或点(意味着由于各个参数的性质而导致不能出现其他字符),或者您有决定一些分隔符并创建一些转义规则。