Django在数据库中存储正则表达式并在页面上评估
我想在我的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¶m2=%s¶m3=%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¶m2=%s¶m3=%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¶m2=%s¶m3=%s'
>>> url = pattern % tuple(param)
>>> url
'www.url?param=2¶m2=6¶m3=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]