Я работаю над классом loginMiddleware для Django. Этот промежуточный класс должен отправлять пользователя на страницу входа, когда он не вошел в систему. Но есть несколько исключений.

Поскольку я запускаю встроенный сервер django, мне пришлось создать медиа-URL. Но знайте, что проблема в том, что когда страница входа загружает файл javascript, файл javascript является страницей входа в систему, потому что пользователь не вошел в систему. По этой причине я сделал заявление:

from django.http import HttpResponseRedirect
from django.conf import settings
import re
class loginMiddelware:
    def process_request(self,request):
        if request.path != settings.LOGIN_PATH and request.user.is_anonymous():
            if request.path.find('media') <= 0:
                return HttpResponseRedirect(settings.LOGIN_PATH)
            else:
                return None

Я имею в виду строку с: if request.path.find ('media') <= 0 :. Это работает, но я не считаю это хорошим методом. Я думаю, что я должен использовать регулярное выражение для этого. Поэтому я посмотрел на функцию re.match и попробовал разные способы, но ничего не получилось. Я хочу регулярное выражение, которое допускает только все URL-адреса, начинающиеся с / media / и заканчивающиеся одним из следующих расширений: js, css, png, gif или jpg.

Как это возможно?

Thanx !

Том

1
Tom 16 Июл 2010 в 14:16

3 ответа

Лучший ответ

Конечно:

DIRECT_ACCESS = re.compile(r'^/media/.*\.(js|css|png|gif|jpg)$')

...

if DIRECT_ACCESS.match(url):
    ...

Подсказка: если вы хотите убедиться, что ваше регулярное выражение работает, напишите пару модульных тестов, которые его выполняют. Таким образом, вы не получите никаких неприятных сюрпризов.

3
Aaron Digulla 16 Июл 2010 в 10:23

Взгляните на промежуточное ПО для входа в систему Мэтта Грейсона. Это позволяет вам определить группу URL-адресов, которые не требуют входа в систему с использованием пользовательской настройки LOGIN_REQUIRED_URLS_EXCEPTIONS.

1
Manoj Govindan 16 Июл 2010 в 10:22

Вам не нужно регулярное выражение:

if request.path.startswith('/path/to/your/media'):
    #do something

Должен сделать свое дело. Вы жалуетесь на то, что если путь запроса содержит:

/protected/secure/media/bla

Что ваша имплантация позволит пользователю пройти.

Таким образом, использование абсолютного пути со строковым методом startswith достаточно для вашей задачи.

2
zovision 16 Июл 2010 в 10:27