Как я могу получить клиентскую информацию, такую как ОС и браузер

Это ожидаемое поведение . Когда вы оцениваете

product.parameters.all()[0]

, это означает, что вы делаете выборку из базы данных. Таким образом, Django получит первый из этих параметров. Так как tol_low и tol_high не являются не постоянными (не хранятся в базе данных), это означает, что это будет откат к атрибуту класса, который равен None.

Расчеты здесь довольно просты, поэтому я предлагаю вам преобразовать их в свойства [Python-doc] :

class MeasurementParameter(models.Model):    
    tolerance = models.FloatField()
    set_value = models.FloatField()

    @property
    def tol_low(self):
        return self.set_value * (100-self.tolerance)/100

    @property
    def tol_high(self):
        return self.set_value * (100+self.tolerance)/100

    def tolerance_band(self):
        return self.tol_high, self.tol_low

Здесь мы таким образом будет оценивать имущество при необходимости. Это более надежно: если вы измените tolerance объекта или set_value, то tol_low и tol_high будут отличаться для этого объекта. Таким образом, нет сложного кода для обновления значения соответствующих обновлений. В calc_all_bands также нет необходимости, поскольку вычисления просто выполняются по запросу.

Обратите внимание, что вы не можете использовать свойства в фильтрах Django ORM и т. Д. В этом случае вы можете закодировать свойство как выражение запроса и аннотировать набор запросов с помощью них.

53
задан Cœur 16 December 2017 в 23:42
поделиться

3 ответа

Вот мой код, который работает, с сегодняшнего дня, с некоторыми последними браузерами.

Естественно, это повредится, поскольку Агент пользователя развивается, но это просто, и легко зафиксировать.

    String userAgent = "Unknown";
    String osType = "Unknown";
    String osVersion = "Unknown";
    String browserType = "Unknown";
    String browserVersion = "Unknown";
    String deviceType = "Unknown";

    try {
        userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36 OPR/60.0.3255.165";
        //userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0";
        //userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36";
        //userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134";
        //userAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1.1 Mobile/15E148 Safari/604.1";
        boolean exceptionTest = false;
        if(exceptionTest) throw new Exception("EXCEPTION TEST");

        if (userAgent.indexOf("Windows NT") >= 0) {
            osType = "Windows";
            osVersion = userAgent.substring(userAgent.indexOf("Windows NT ")+11, userAgent.indexOf(";"));

        } else if (userAgent.indexOf("Mac OS") >= 0) {
            osType = "Mac";
            osVersion = userAgent.substring(userAgent.indexOf("Mac OS ")+7, userAgent.indexOf(")"));

            if(userAgent.indexOf("iPhone") >= 0) {
                deviceType = "iPhone";
            } else if(userAgent.indexOf("iPad") >= 0) {
                deviceType = "iPad";
            }

        } else if (userAgent.indexOf("X11") >= 0) {
            osType = "Unix";
            osVersion = "Unknown";

        } else if (userAgent.indexOf("android") >= 0) {
            osType = "Android";
            osVersion = "Unknown";
        }
        logger.trace("end of os section");

        if (userAgent.contains("Edge/")) {
            browserType = "Edge";
            browserVersion = userAgent.substring(userAgent.indexOf("Edge")).split("/")[1];

        } else if (userAgent.contains("Safari/") && userAgent.contains("Version/")) {
            browserType = "Safari";
            browserVersion = userAgent.substring(userAgent.indexOf("Version/")+8).split(" ")[0];

        } else if (userAgent.contains("OPR/") || userAgent.contains("Opera/")) {
            browserType = "Opera";
            browserVersion = userAgent.substring(userAgent.indexOf("OPR")).split("/")[1];

        } else if (userAgent.contains("Chrome/")) {
            browserType = "Chrome"; 
            browserVersion = userAgent.substring(userAgent.indexOf("Chrome")).split("/")[1];
            browserVersion = browserVersion.split(" ")[0];

        } else if (userAgent.contains("Firefox/")) {
            browserType = "Firefox"; 
            browserVersion = userAgent.substring(userAgent.indexOf("Firefox")).split("/")[1];
        }            
        logger.trace("end of browser section");

    } catch (Exception ex) {
        logger.error("ERROR: " +ex);            
    }

    logger.debug(
              "\n userAgent: " + userAgent
            + "\n osType: " + osType
            + "\n osVersion: " + osVersion
            + "\n browserType: " + browserType
            + "\n browserVersion: " + browserVersion
            + "\n deviceType: " + deviceType
            );

Вывод Регистратора:

 userAgent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36 OPR/60.0.3255.165
 osType: Windows
 osVersion: 10.0
 browserType: Opera
 browserVersion: 60.0.3255.165
 deviceType: Unknown
0
ответ дан 7 November 2019 в 08:26
поделиться

Браузер отправляет эту информацию в заголовке HTTP. См. Пример кода отслеживания Tomcat ( исходный код , онлайн-демонстрация ).

Обратите внимание, что эта информация не является надежной. Браузер может лгать и лжет о том, кто они и на какой ОС они работают.

6
ответ дан 7 November 2019 в 08:26
поделиться

Лучше всего использовать заголовок User-Agent. Вы можете получить его так в JSP или сервлете,

String userAgent = request.getHeader("User-Agent");

Заголовок выглядит так,

User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.0.13) Gecko/2009073021 Firefox/3.0.13

Он предоставляет подробную информацию о браузере. Тем не менее, это в значительной степени свободный формат, поэтому очень сложно расшифровать каждый из них. Вам просто нужно выяснить, какие браузеры вы будете поддерживать, и написать парсер для каждого из них. Когда вы пытаетесь определить версию браузера, всегда сначала проверяйте более новую версию. Например, Пользовательский агент IE6 может содержать IE5 для обратной совместимости. Если вы сначала проверите IE5, IE6 также будет отнесен к IE5.

Вы можете получить полный список всех значений пользовательских агентов на этом веб-сайте,

http://www.user-agents.org/

С помощью User-Agent вы можете указать точную версию браузера. Вы можете получить довольно хорошее представление об ОС, но вы не сможете различать разные версии одной и той же ОС, например, Windows NT и 2000 могут использовать один и тот же User-Agent.

Здесь ничего не говорится о разрешении. Однако вы можете получить это с помощью Javascript при вызове AJAX.

вы можете указать точную версию браузера. Вы можете получить довольно хорошее представление об ОС, но вы не сможете различать разные версии одной и той же ОС, например, Windows NT и 2000 могут использовать один и тот же User-Agent.

Здесь ничего не говорится о разрешении. Однако вы можете получить это с помощью Javascript при вызове AJAX.

вы можете указать точную версию браузера. Вы можете получить довольно хорошее представление об ОС, но вы не сможете различать разные версии одной и той же ОС, например, Windows NT и 2000 могут использовать один и тот же User-Agent.

Здесь ничего не говорится о разрешении. Однако вы можете получить это с помощью Javascript при вызове AJAX.

58
ответ дан 7 November 2019 в 08:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: