У меня есть 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. Но он говорит, что «имя '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
djangodjames 15 Апр 2020 в 15:40

1 ответ

Лучший ответ

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

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

Однако вам нужно будет передать в эту функцию 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: ложно, вы попытаетесь вернуть несуществующую переменную (она определена только в рамках этого оператора if). Итак, теперь функция просто вернет None, если это условие не выполнено.

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

url = checkurl(request)

if url is not None and url != '':
    ...
0
RHSmith159 15 Апр 2020 в 12:51