Как преодолеть статус 412, выданный пакетом Python запросов? - PullRequest
0 голосов
/ 17 июня 2020

Почему мой сценарий python, использующий пакет requests, не может загрузить файл tar.gz, в то время как команда BASH wget может? Он пожаловался, что запрошенный ресурс не может быть найден (412). Как мне решить эту проблему?

Обновление: Я обнаружил, что после деактивации VPN мой сценарий python может работать. Это не будет работать, когда VPN активирован. Однако wget работал, когда VPN активирован и не активирован. Почему это так? Есть ли какие-то настройки, которые необходимо выполнить на requests, чтобы преодолеть статус 412?

Мой Python3 .6 сценарий:

#!/usr/bin/python3.6
# -*- coding: utf-8 -*-

from pathlib import Path
import requests
import sys


def download_sdk( url, sdkname ):
    print( f'\nDownloading SDK...' )
    print( f'url = {url}' )
    print( f'sdkname = {sdkname}' )
    r = requests.get( url )
    #response less than 400 response, open in binary mode and write sdk to user defined vulkan directory
    if r.ok: 
        with open( sdkname, "wb" ) as file:
            file.write( r.content )
    else:
        sys.exit( print( f'Quit: requests_status_code={r.status_code}' ) )
    print( f'\nDownload Completed.' )
    return True


sdk = f'vulkansdk-linux-x86_64-1.1.121.1.tar.gz'
url = f'https://sdk.lunarg.com/sdk/download/1.1.121.1/linux/{sdk}?u='
sdkname = Path.cwd() / sdk
download_sdk( url, sdkname )

Python вывод сценария:

Downloading SDK...
url = https://sdk.lunarg.com/sdk/download/1.1.121.1/linux/vulkansdk-linux-x86_64-1.1.121.1.tar.gz?u=
sdkname = /home/master/Vulkan/Installers/vulkansdk-linux-x86_64-1.1.121.1.tar.gz
Quit: requests_status_code=412

BASH Команда wget может загрузить файл tar.gz.

$ wget https://sdk.lunarg.com/sdk/download/1.1.121.1/linux/vulkansdk-linux-x86_64-1.1.121.1.tar.gz?u=
--2020-06-17 23:11:28--  https://sdk.lunarg.com/sdk/download/1.1.121.1/linux/vulkansdk-linux-x86_64-1.1.121.1.tar.gz?u=
Resolving sdk.lunarg.com (sdk.lunarg.com)... 2604:86c0:5000:3::3, 38.143.66.106
Connecting to sdk.lunarg.com (sdk.lunarg.com)|2604:86c0:5000:3::3|:443... failed: Connection refused.
Connecting to sdk.lunarg.com (sdk.lunarg.com)|38.143.66.106|:443... connected.
HTTP request sent, awaiting response... 200 OK
Syntax error in Set-Cookie: u=H0TJAB4JavYv3jKUtK1SDiu2UjlaBDHatNkvDosqN8ppYXwEVEX45Z60GLqE%0A6k5%2BerCS3KZHcD8RhV7liLcoYQ%3D%3D; ; path=/; SameSite=Lax at position 100.
Syntax error in Set-Cookie: a=XZxs35QBwvluz8x%2Bgl5n4w%3D%3D; expires=Fri, 10 Jun 2050 15:11:31 +0000; ; path=/; SameSite=Lax at position 74.
Length: 119858765 (114M) [application/octet-stream]
Saving to: ‘vulkansdk-linux-x86_64-1.1.121.1.tar.gz?u=’

vulkansdk-linux-x86_64-1.1.121.1.tar.gz?u=           100%[====================================================================================================================>] 114.31M   576KB/s    in 3m 12s  

2020-06-17 23:14:43 (610 KB/s) - ‘vulkansdk-linux-x86_64-1.1.121.1.tar.gz?u=’ saved [119858765/119858765]

1 Ответ

0 голосов
/ 17 июня 2020

Я получил работу с этой функцией и urllib.parse.urljoin() для генерации URL:

import requests
from urllib.parse import urljoin

def download(url, path):
    response = requests.get(url) # get the response of the ink
    with open(path, 'wb') as file: # create the file
        file.write(response.content) # write the contents of the response to the file

base_url = 'https://sdk.lunarg.com/sdk/download/1.1.121.1/linux/'
sdk = 'vulkansdk-linux-x86_64-1.1.121.1.tar.gz'
query = '' # if you need to adda query stirng like '?u=' but that didn't make a difference in this case
url = urljoin(base_url, sdk, query) # make the full url
print(url)

download(url, f'./{sdk}')
...