Pyodide에서 네트워크 요청을 구현하는 3가지 방법

의문



앞서 Online Python Tool을 언급했는데, 핵심 기술은 파이썬을 웹 페이지에서 실행할 수 있는 Pyodide 라이브러리라는 도구를 사용하는 것이지만 학습 과정에서 모든 파이썬 내장 라이브러리나 확장 라이브러리가 아니라는 것을 발견했습니다. requests와 같은 실행 가능은 지원되지 않습니다.

issue 의 논의에 따르면, requestsLib/http.client.py 에 의존하는 Lib/sockets.py 에 의존하는 socketmodule.c 를 필요로 하는 <sys/socket.h> 에 의존합니다. Emscripten은 <sys/socket.h> 지원을 제공하지만 이를 사용하는 경우 http 요청은 웹 소켓 연결을 허용하는 사용자 정의 서버와 함께 사용하거나 요청을 실제 http 요청으로 전달할 수 있는 서버를 통해 모든 요청을 프록시 처리한 경우에만 작동합니다. ). 그래서 그것은 이상적이지 않을 것입니다.

따라서 로컬 Python 프로그램이 requests 메서드를 사용하는 경우 온라인 Python 도구로 전환하여 실행할 때 네트워크 요청 사용을 업데이트해야 합니다. 여기에서는 네트워크 요청의 세 가지 방법을 간략하게 소개합니다.

해결책



1. http.open_url



주어진 URL을 동기식으로 가져옵니다.

import pyodide
print(pyodide.http.open_url('https://mocki.io/v1/d4867d8b-b5d5-4a48-a4ab-79131b5809b8').read())


온라인 데모: Python Playground - http.open_url

2. http.pyfetch



URL을 가져오고 응답을 반환합니다.

import pyodide

async def get_data():
    response = await pyodide.http.pyfetch('https://mocki.io/v1/d4867d8b-b5d5-4a48-a4ab-79131b5809b8')
    data = await response.json()
    print(data)

get_data()


온라인 데모: Python Playground - http.pyfetch

이 방법은 이미지 데이터를 얻는 데 권장됩니다.

# request image
response = await pyodide.http.pyfetch('https://gcore.jsdelivr.net/gh/openHacking/static-files@main/img/16576149784751657614977527.png')
# Return the response body as a bytes object
image_data = await response.bytes()


자세한 참조 사례: Python Image to ASCII Online

3. js 모듈에서 가져오기



Pyodide는 js API를 래핑하고 기본 js 가져오기 API를 사용하여 네트워크 요청을 구현합니다.

import json
from js import fetch, JSON

async def get_data():
    response = await fetch('https://mocki.io/v1/d4867d8b-b5d5-4a48-a4ab-79131b5809b8',{'method':'GET'})
    data = await response.json()
    print(JSON.stringify(data))

await get_data()


온라인 데모: Python Playground - js fetch

결론



이상으로 정리한 Pyodide에서 일반적으로 사용되는 세 가지 네트워크 요청 방법입니다. 부족한 점이 많을 수 있습니다. 더 좋은 방법이 있다면 공유 부탁드립니다.

참조


  • 3 Ways to Implement Network Requests in Pyodide
  • pyodide python api
  • pyodide.http.open_url
  • pyodide.http.pyfetch
  • pyodide.runPythonAsync
  • pyodide - requests module is not available #398
  • 좋은 웹페이지 즐겨찾기