2

我在用

import base64
string_for_url = base64.urlsafe_b64encode(string_to_format)

但我不确定如何在 url 模式中匹配生成的字符串。我找到了这个正则表达式:(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$但我不明白如何将其转换为命名组。如您所知,我的正则表达式知识非常有限。

感谢您提前提供任何帮助。

4

4 回答 4

5

命名一个组,以便将其传递给您的视图方法,并在其前面加上(?P<name_of_variable>(group to name)). 顺便说一句,这不是 django 特有的,它是标准 Python正则表达式语法的一部分。

对于您的示例,它将是:

base64_pattern = r'(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$'
urlpatterns = patterns('',
    (r'^foo/bar/(?P<base64string>{})'.format(base64_pattern), 'mymethod'),
    # your other patterns
)

# in the view

def mymethod(request, base64string):
   # do stuff with base64string
于 2012-12-11T05:01:04.663 回答
5

该正则表达式似乎不必要地复杂。

我的 Django 生锈了,但你应该能够做到:

urlpatterns = patterns('',
    (r'things/(?P<b64_string>.+)', views.b64_view, name='b64_view')
)

这将匹配看起来像 www.example.com/things/abc123= 的任何内容,并将 'abc123=' 传递到 views.b64_string 视图的 b64_string 参数中。

然后,您可以通过尝试对其进行解码来测试它是否被 b64 编码。这比尝试找到与 b64 编码字符串匹配的正则表达式要简单得多。

于 2012-12-11T05:01:53.233 回答
0

从 2.0 开始,djano在 url 路径中使用捕获的值。

urlpatterns = [
  path('articles/2003/', views.special_case_2003),
  path('articles/<int:year>/', views.year_archive),
]

当然,如果内置路径转换器 ( str, int, slug, uuid, path) 不够具体,您仍然可以使用正则表达式。在 url-safe base 64 编码的情况下,slug 可能匹配,但如果你需要.=然后~你可以定义你自己的:

转换器.py

class b64Converter:
    # decide on complexity of your b64 regex by
    # referring to https://stackoverflow.com/a/475217
    regex = 'define_your_regex here'

    def to_python(self, value):
        return base64.urlsafe_b64decode(value)

    def to_url(self, value):
        return base64.urlsafe_b64encode(value)

然后是 urls.py:

from django.urls import path, register_converter
from . import converters, views

register_converter(converters.b64Convertor, 'b64')

urlpatterns = [
    path('widgets/<b64:my_url_param>/', views.widgetview),
    ...
]
于 2018-08-24T08:33:06.697 回答
-3

这个怎么样:(?P<string_to_format>[0-9A-Za-z]+)

于 2012-12-11T04:49:10.790 回答