Django在数据库中存储正则表达式并在页面上评估

0 投票
3 回答
999 浏览
提问于 2025-04-15 20:34

我想在我的Django模型中存储一些网址模式,用户可以提供参数来生成网址。

比如,我可能会在数据库中存储这三个网址,其中的%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为数据库中的变量,生成这些网址的最佳方法是什么呢?

是不是只需要简单地替换字符串,比如:

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

还是说有更好的方法呢?

补充一下,如果用户可以选择存储单个变量或多个变量,然后在字符串中替换多个变量,那就更好了,比如:

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

你可以这样做:

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

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

或者像Ignacio建议的那样,使用 ast.literal_eval(params)

3

ast.literal_eval() 是一个可以把字符串转换成 Python 里的值或结构的工具。如果你要转换的是一个 list(列表),那么在使用字符串插值之前,先把它传给 tuple()

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]

撰写回答