Как использовать переменную из одной функции в другой функции в Django представлениях - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть 2 функции:

Функция 1 проверяет URL для схемы:

def checkurl(self):
    if request.method == 'POST' and 'url' in request.POST:
        url = request.POST.get('url', '')
        if not url.startswith('http://') and not url.startswith('https://'):
            url = "https://" + url
    return url

Функция 2 должна использовать переменную url. Но там написано, что «имя» не определено ». Вот вторая функция:

def tests(request):

    ##################################################
    # URL Parse: netloc, scheme
    ##################################################

    x = datetime.datetime.now()
    time = x.strftime("%Y-%m-%d-%H-%M-%S")

    if request.method == 'POST' and 'url' in request.POST:
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'}#headers

        # Set Width and Height

        width_get = request.POST.get('width', '')
        height_get = request.POST.get('height', '')
        if width_get is not None and width_get != '':
            width = width_get
        else:
            width = 1600
        if height_get is not None and height_get != '':
            height = height_get
        else:
            height = 1000

        if url is not None and url != '':

            url_parsed = urlparse(url)
            scheme = url_parsed.scheme
            netloc = url_parsed.netloc
            if netloc.startswith('www.'):
                netloc = netloc.replace('www.', '')
            image_path = "media/" + netloc + "-" + time + ".png"
            shot_path = "/media/" + netloc + "-" + time + ".png"
            path = "C:/WebDrivers/chromedriver.exe"
            driver = webdriver.Chrome(path)
            driver.get(url)
            driver.set_window_size(width, height)
            driver.save_screenshot(image_path)
            screenshot = image_path
            driver.quit()
            var_dict = {
                'screenshot': screenshot,
                'shot_path':shot_path,
                'netloc':netloc,
                }
            return render(request, 'apptests/shots.html', var_dict)
    else:
        return render(request, 'apptests/shots.html')

Как я могу использовать переменную URL из первой функции в моей второй функции?

1 Ответ

0 голосов
/ 15 апреля 2020

Похоже, вы не звоните checkurl, поэтому, когда вы делаете if url is not None and url != '':, переменная url еще не определена.

вам просто нужно добавить url = checkurl() перед этой строкой I подумайте.

Однако вам нужно будет передать request этой функции вместо self, насколько я могу судить по опубликованному вами коду, checkurl, похоже, не быть методом в классе, и вы используете функциональные представления для представления tests.

Итак, checkurl будет:

def checkurl(request):
    if request.method == 'POST' and 'url' in request.POST:
        url = request.POST.get('url', '')
        if not url.startswith('http://') and not url.startswith('https://'):
            url = "https://" + url
        return url

Обратите внимание, что отступ return url. Это так, что url возвращается только если он у нас есть. В вашей текущей функции checkurl, если if request.method == 'POST' and 'url' in request.POST: равно false, вы будете пытаться вернуть переменную, которая не существует (она определена только в области действия оператора if). Так что теперь функция просто вернет None, если это условие не будет выполнено.

Тогда вам просто нужно импортировать эту функцию в ваш файл views.py (если он находится в отдельном файле) и вызвать его выше это if заявление:

url = checkurl(request)

if url is not None and url != '':
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...