【问题标题】:Django| generate random url based on URl or PATH from urlconfig姜戈|根据 urlconfig 中的 URl 或 PATH 生成随机 url
【发布时间】:2020-12-22 17:43:54
【问题描述】:

我有一个关于根据 Django url 和路径生成示例 url 的问题。

例如,如果我有 2 个网址,例如:

 path('example/<int:example_id>/', views.some_view, name='example')

 url(r'^example/(?P<example_id>[0-9]+)/$', views.some_view, name='example')


是否可以通过 Django 内置方式以某种方式生成用于测试的示例完整 URL,例如:

example/234/
example/93/
example/228/
etc…

随机。

对于基于具体名称+regexconverter参数的不同url?

换句话说,Django 在源代码中理解&lt;int:example_id&gt; 是一个整数等等。如果我有类似的东西:1)我希望example/ 2)我希望int - 我将能够使用它来生成随机示例网址。

希望这很清楚......

这些网址只是一个示例。真实的网址会有所不同。

谢谢。

【问题讨论】:

标签: django


【解决方案1】:

换句话说,Django 在源代码中理解&lt;int:example_id&gt; 是一个整数等等。

这实质上是在path 中寻找&lt;…:…&gt; 模式。 Django 还有一组路径转换器。标准的是intstrsluguuidpath,但您可以定义自己的自己的路径转换器。事实上,Django 文档中有一个部分 registering custom path converters 解释了如何设计自己的路径转换器。

路径的基本作用是构造一个正则表达式。因此,它会搜索像&lt;int:example_id&gt; 这样的模式。由于您这里使用了int,所以使用了IntConverter [GitHUb]

class IntConverter:
    regex = '[0-9]+'

    def to_python(self, value):
        return int(value)

    def to_url(self, value):
        return str(value)

因此它将在这里将&lt;int:example_id&gt; 替换为(?&lt;example_id&gt;[0-9]+),因此将使用regex 部分。

path(…) 不仅构造正则表达式。它还通过调用 .to_python(…) 自动将捕获的项目映射到 Python 对象。因此,这意味着如果您使用re_path(r'^example/(?P&lt;example_id&gt;[0-9]+)/$', …),那么example_id 将是一个字符串,但对于path('example/&lt;int:example_id&gt;/', …),它将自动在捕获的字符串上调用int(…),从而传递一个int 对象。通常这并没有太大区别。

当您序列化一个对象时,这也成立:您可以传递一个值,它会在对象上调用.to_url(…) 以将其转换为生成的URL 的字符串表示形式。因此,这意味着您可以编写自定义路径转换器,从而执行更复杂的转换。

我希望example/ 2) 我希望int - 我可以使用它来生成随机示例网址。

最终它归结为一个正则表达式。正则表达式可以转换为有限状态机,因此我们可以生成随机的有效字符串。例如exrex [GitHub] 能够生成所有有效字符串(这通常是一个会不断提出新字符串的生成器),或者与正则表达式匹配的随机字符串。然而,并不是说因为它与path(…) 匹配,所以它对视图是有意义的。例如,如果您将此 int 用作它正在获取的 Post 对象的主键,那么对于随机 URL,您很可能会为不存在的 Posts 生成 URL。

【讨论】:

  • 非常有成果的解释。非常感谢
猜你喜欢
  • 2021-05-09
  • 2015-07-15
  • 2021-07-02
  • 2013-03-17
  • 2012-02-12
  • 1970-01-01
  • 2012-08-05
  • 2017-10-02
  • 1970-01-01
相关资源
最近更新 更多