Получить пользователя из сегмента URL с Django - PullRequest
1 голос
/ 26 июля 2010

У меня есть веб-приложение, которое будет возвращать идентификатор пользователя на основе первого сегмента URL, очень похоже на Twitter:

http://www.myapplication.com/user-name-goes-here/

Это тоже может пойти глубже, вот так:

http://www.myapplication.com/user-name-goes-here/news/article_1/

Чтобы сломать сайт, я использую следующую технику маршрутизации URL:

(r'^(?P<slug>\w+)/', include('myapp.sites.urls')),

Это затем направит пользователя на правильную страницу, но в существующем состоянии мне приходится запрашивать базу данных в каждом представлении, чтобы получить идентификатор_пользователя на основе первого сегмента URL. Я надеялся как-то автоматизировать это, чтобы мне не приходилось каждый раз разбрасывать свои представления одним и тем же кодом ... Мое решение заключалось в создании некоторого промежуточного программного обеспечения, которое проверяет сегмент URL и возвращает 404, если его не найдено:

    from django.http import Http404

class DomainMiddleware(object):
    def process_request(self, request):
        from myapp.sites.models import Sites

        dname = request.path.split('/')[1]
        if not dname:
            return
        try:
            d = Sites.objects.get(domain__exact=dname)
        except Sites.DoesNotExist:
            raise Http404

        return

Это работает, но пытается проанализировать КАЖДЫЙ запрос, даже те, которые относятся к изображениям, значкам и т. Д.

Мой вопрос таков; Есть ли способ выполнить этот запрос при каждой загрузке страницы, не забивая мои просмотры дополнительным кодом? Если промежуточное программное обеспечение является решением, как я могу изменить свой код, чтобы он не включал КАЖДЫЙ запрос, а только те, которые были успешно перенаправлены по URL?

Надеюсь, кто-то может помочь!

1 Ответ

3 голосов
/ 26 июля 2010

Сервер Django не должен обрабатывать запросы на статические URL-адреса содержимого - конечно, в любом случае он не находится в производстве, где у вас будет другой веб-сервер, работающий для этого, так что это не должно быть проблемой там.

Но если вы скажете, что хотите, чтобы это работало только для успешно перенаправленных URL-адресов, возможно, вам лучше использовать process_view, а не process_request в промежуточном программном обеспечении? http://docs.djangoproject.com/en/dev/topics/http/middleware/#process-view

process_view работает на уровне представления, а не на уровне запроса, и предоставляет аргумент view_func, который вы можете проверить, чтобы ваш код не работал, когда это представление django.views.static.serve, используемое для обслуживания статических носителей во время разработки.

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

...