参数Djang中的斜杠

2024-09-30 18:25:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Django作为一个restfulapi,我有类似url(r'^datavore/(?P<configuration>.*)/(?P<dataset>.*)/(?P<varname>.*)/(?P<region>[a-z-A-Z\_]+)/(?P<date_range>.*)/filelist/$', views.filelist,name="filelist"),的url

我的问题是,当dataset参数包含“/”时,它修改了url的结构,而dataset参数只包含/后面的字符串。你知道怎么解决这个问题吗?在


Tags: djangonameurl参数daterange结构dataset
2条回答

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

因此,要么那些在内部使用斜杠的参数允许使用其他安全字符,如破折号或点(这意味着由于各自参数的性质,存在无法出现的字符),要么您必须决定一些分隔符并创建一些转义规则。在

如果只有一个参数可以有斜杠,那么可以通过指定regex来解决问题,其中只允许一个捕获组具有斜杠。例如:

^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/将生成匹配组的下一个值:

^{pr2}$

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

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

相关问题 更多 >