我正在使用
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}=)?$
但我不明白如何将它转换为命名组。正如你可以告诉我的正则表达式知识非常有限。
感谢您提前提供任何帮助。
答案 0 :(得分:5)
要命名一个组,以便将其传递给您的视图方法,并在其前面添加(?P<name_of_variable>(group to name))
。顺便说一句,这不是django特有的东西,它是标准Python regular expression syntax的一部分。
对于你的例子,它将是:
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
答案 1 :(得分: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编码的字符串匹配的正则表达式要简单得多。
答案 2 :(得分:0)
从2.0开始,djano在网址路径中使用captured values。
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可能匹配,但是如果您需要.
,=
和~
,则可以定义自己的:
convertors.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),
...
]
答案 3 :(得分:-3)
这个怎么样:(?P<string_to_format>[0-9A-Za-z]+)