参数Django中的斜线

时间:2016-02-25 16:39:59

标签: python django

我正在使用Django作为一个宁静的api,我有像compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:design:23.1.1'

这样的网址

我的问题是,当数据集参数包含'/'时,它会修改我的url的结构,dataset参数只包含/后面的字符串。知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分: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`

如果有几个组可以使用斜杠,那么没有准确的方法可以在路径中使用额外的文本来正确匹配它们。路径中包含额外文本的示例解决方案:

^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参数

答案 1 :(得分:0)

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

因此,在内部使用斜杠的那些参数允许某些其他安全字符(如破折号或点)(意味着由于相应参数的性质而存在不会发生的字符),或者您必须决定一些分隔符并创建一些转义规则。