سؤال

لدي نوعان مختلفان من الكائنات التي أرغب في العيش تحت عنوان URL نفسه. يجب تمرير مجموعة من الكائنات ليتم تمريرها إلى وظيفة العرض "FOO" ويجب أن يتم تمرير مجموعة أخرى إلى "بار".

أنا حاليا أفعل هذا مع قائمة طويلة كبيرة من عناوين URL المصابين، مثل ...

urlpatterns = patterns('project.views',
    (r'^a/$', 'foo'),
    (r'^b/$', 'foo'),
    (r'^c/$', 'foo'),
    #...and so on until...
    (r'^x/$', 'bar'),
    (r'^y/$', 'bar'),
    (r'^z/$', 'bar'),
)

هل من الممكن تحديد قائمة كل نوع من عناوين URL مثل ...

foo_urls = ['a', 'b', 'c'] #...
bar_urls = ['x', 'y', 'z'] #...

... ثم تحقق من عنوان URL الوارد ضد تلك القوائم؟ (إذا كان في "foo_urls"، أرسل إلى "project.views.foo"؛ إذا كان في "bar_urls"، أرسل إلى "project.views.bar")؟

أقتصر على الحفاظ على هذا الهيكل للحفاظ على التوافق مع عناوين URL من الموقع السابق، ولكن أي نصيحة حول طرق تبسيط Urls.py سيكون موضع تقدير كبير.

هل كانت مفيدة؟

المحلول

عادة ما يتم التعبير عن خرائط عنوان URL بشكل صريح، لكنها لا يجب أن تكون. ماذا عن بناء خريطة URL الخاصة بك من قوائمك؟

foo_urls = ['a', 'b', 'c'] #...
bar_urls = ['x', 'y', 'z'] #...

# A first pattern to get urlpatterns started.
urlpatterns = pattern('project.views', 
    ('blah', 'blah')
    )

# Append all the foo urls.
for foo_url in foo_urls:
    urlpatterns += patterns('project.views',
        ('^' + foo_url + '/$', 'foo')
        )

# Append all the bar urls.
for bar_url in bar_urls:
    urlpatterns += patterns('project.views',
        ('^' + bar_url + '/$', 'bar')
        )

نصائح أخرى

أنماط عنوان URL في Django تعبيرات منتظمة، لذلك هذا هو بالفعل ممكن:

urlpatterns = patterns('project.views',
    (r'^[abc]/$', 'foo'),
    (r'^[xyz]/$', 'bar'),
)

إذا كنت تستخدم A، B، C كمفروجات نائبة مثال لحرف غير مفرد، فيمكنك استخدام الأوتار الكاملة بدلا من ذلك، ولكن كن حذرا للتأكد من اتباع قواعد مطابقة Regex:

urlpatterns = patterns('project.views',
    (r'^(foo|slithy|toves)/$', 'foo'),
    (r'^(bar|twas|brillig)/$', 'bar'),
)

يمكنك استبدال URLPatterns مع واحد يمسك جميع عناوين URL، ثم حرك المنطق للاختيار بين foo و bar عناوين URL إلى الرأي.

urlpatterns = patterns('project.views',
    (r'^(?P<letter>[a-z])/$', 'foobar'),
)

ثم اكتب وظيفة foobar في views.py

def foobar(request, letter):

    foo_urls = ['a', 'b', 'c'] #...
    bar_urls = ['x', 'y', 'z'] #...
    if slug in foo_urls:
        return foo(request)
    if slug in bar_urls:
        return bar(request)
    else:
         #oh dear, you've caught a
         #url that isn't foo or bar
         #return 404?

كبديل، قد ترغب في استكشاف django إعادة توجيه التطبيق, ، إعادة تصميم هيكل URL، ثم قم بإعداد إعادة توجيهات URL القديمة.

إذا كنت قد حصلت على Apache أمام تطبيقك:

<LocationMatch "^[a-w]/$">
   ...
</LocationMatch>

<LocationMatch "^[x-z]/$">
   ...
</LocationMatch>

.

يمكنك أيضا استخدام إعادة كتابة عنوان URL أو عددا من إعدادات تكوين Apache الأخرى التي تقبل حجج Regex.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top