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))ます。ちなみに、これは標準のPython正規表現構文の一部であるdjangoに固有のものではありません。

あなたの例では、次のようになります。

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 =のように見えるものと一致し、views.b64_stringビューのb64_string引数に「abc123=」を渡します。

次に、デコードを試みるだけで、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。URLセーフのBase64エンコーディングの場合、slugは一致する可能性がありますが、必要に応じて、独自に定義できます。sluguuidpath.=~

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),
    ...
]
于 2018-08-24T08:33:06.697 に答える
-3

これはどう:(?P<string_to_format>[0-9A-Za-z]+)

于 2012-12-11T04:49:10.790 に答える