Django在DB中存储正则表达式,然后在页面上进行评估

时间:2010-03-18 12:09:31

标签: python django replace

我想在我的django模型中存储一些url模式,用户可以提供参数来创建URL。

例如,我可能会在我的数据库中存储这3个网址,其中%s是用户提供的变量参数:

  • www.thisissomewebsite.com?param=%s
  • www.anotherurl /%S /
  • www.lastexample.co.uk?param1=%s&fixedparam=2

从这些示例中可以看出,参数可以出现在字符串中的任何位置,而不是固定位置。

我有两个模型,一个持有网址,另一个持有变量:

class URLPatterns(models.Model):
    pattern = models.CharField(max_length=255)

class URLVariables(models.Model):
    pattern = models.ForeignKey(URLPatterns)
    param = models.CharField(max_length=255)

通过将%s替换为数据库中的变量来生成这些URL的最佳方法是什么。

它只是对字符串的简单替换,例如:

urlvariable = URLVariable.objects.get(pk=1)
pattern = url.pattern
url = pattern.replace("%s", urlvariable.param)

还是有更好的方法吗?

EDIT 如果用户可以选择存储单个变量或变量列表,然后替换字符串中的多个变量,那也很好。

u = URLPatterns(pattern='www.url?param=%s&param2=%s&param3=%s')
v = URLVariables(pattern=u, param='[2,6,3]')

url = SOME WAY TO REPLACE THE 3 %s WITH THE 3 VARIABLES IN THE ARRAY (this would need to be converted from a string in someway)

由于

3 个答案:

答案 0 :(得分:3)

ast.literal_eval()可用于将字符串解析为Python值或结构。如果它是list,则在使用字符串插值之前将其传递给tuple()

答案 1 :(得分:1)

>>> param = [2, 6, 3]
>>> pattern = 'www.url?param=%s&param2=%s&param3=%s'
>>> url = pattern % tuple(param)
>>> url
'www.url?param=2&param2=6&param3=3'

如果 param '[2,6,3]'之类的字符串,则可以使用ast.literal_eval()或json.loads():

>>> ast.literal_eval('[2,6,3]')
[2, 6, 3]

>>> json.loads(param)
[2, 6, 3]

>>> simplejson.loads(param)
[2, 6, 3]

答案 2 :(得分:0)

你可以这样做:

pattern="www.url?param=%s&param2=%s&param3=%s"
params = "[1, 2, 3]"

url = pattern % tuple(s.strip('[] ') for s in params.split(','))

或使用ast.literal_eval(params)作为Ignacio建议。