Django: получить заголовок страницы из промежуточного программного обеспечения - PullRequest
1 голос
/ 07 июля 2019

У меня есть небольшое промежуточное программное обеспечение, которое я написал для отслеживания активности пользователей:

class AccessLogs(object):

def __init__(self, get_response):
    self.get_response = get_response

def __call__(self, request):
    response = self.get_response(request)

    if "/media/" not in request.path:
        try:
            ActivityLog(user=request.user, pageURL=request.path).save()
        except Exception as e:
            print(e)

    return response

Есть ли способ получить заголовок страницы, используя этот метод промежуточного программного обеспечения? Я посмотрел много вещей здесь, таких как templateview, пользовательский ответ, но, похоже, ничего не работает. Есть ли какой-либо класс или функция, которая получает заголовок посещенной страницы? Любая помощь будет очень признательна.

РЕДАКТИРОВАТЬ: я пытаюсь найти способ получения заголовка страницы, которую пользователь только что посетил, поэтому я могу сохранить ее вместе с другой информацией в базе данных вместе с этим в этом промежуточном программном обеспечении.

1 Ответ

2 голосов
/ 07 июля 2019

Да , хотя не все ответы являются ответами HTTP, и не все ответы HTTP имеют как таковые заголовок.Но мы можем сделать все возможное, чтобы получить заголовок из ответа.

Для этого мы можем использовать скребок HTML, например beautifulsoup4 [зычный] .Вам может потребоваться установить:

pip install <b>beautifulsoup4 lxml</b>

Затем мы можем получить заголовок из ответа с помощью:

from bs4 import BeautifulSoup

def get_response_title(response):
    try:
        soup = BeautifulSoup(response.content, 'lxml')
        return soup.<b>find('title').getText()</b>
    except AttributeError:
        return None

Таким образом, вы можете использовать это в промежуточном программном обеспечении, например:

class AccessLogs(object):

    def __call__(self, request):
        response = self.get_response(request)
        if '/media/' not in request.path:
            try:
                <b>title = get_response_title(response)</b>
                ActivityLog(user=request.user, <b>title=title</b>, pageURL=request.path).save()
            except Exception as e:
                print(e)

При этом, как говорит @ IainShelvington , это замедлит обработку, так как мы каждый раз посмотрим на ответ.Некоторые фреймворки веб-разработки, такие как Yesod [yesodweb.com] устанавливают заголовок как переменную, передаваемую в обработчик, и, таким образом, делают его более удобным для обнаружения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...