Python의 CURL 대안
PHP에서 사용하는 cURL 호출이 있습니다.
curl -i -H 'Accept: application/xml' -u login:key "https://app.streamsend.com/emails"
파이썬에서도 같은 방법이 필요합니다.파이썬에서 cURL을 대체할 수 있는 방법이 있습니까?나는 urlib는 알지만 사용법을 전혀 모릅니다.
요청 라이브러리를 사용할 수 있습니다.설치 대상
pip install requests
설명서는 https://requests.readthedocs.io/en/latest/ 에서 찾을 수 있습니다.
import urllib2
manager = urllib2.HTTPPasswordMgrWithDefaultRealm()
manager.add_password(None, 'https://app.streamsend.com/emails', 'login', 'key')
handler = urllib2.HTTPBasicAuthHandler(manager)
director = urllib2.OpenerDirector()
director.add_handler(handler)
req = urllib2.Request('https://app.streamsend.com/emails', headers = {'Accept' : 'application/xml'})
result = director.open(req)
# result.read() will contain the data
# result.info() will contain the HTTP headers
# To get say the content-length header
length = result.info()['Content-Length']
대신 urllib2를 사용하여 cURL을 호출합니다.완전히 테스트되지 않았습니다.
다음은 GitHub의 API에 대해 기본 인증을 수행하는 urllib2를 사용하는 간단한 예입니다.
import urllib2
u='username'
p='userpass'
url='https://api.github.com/users/username'
# simple wrapper function to encode the username & pass
def encodeUserData(user, password):
return "Basic " + (user + ":" + password).encode("base64").rstrip()
# create the request object and set some headers
req = urllib2.Request(url)
req.add_header('Accept', 'application/json')
req.add_header("Content-type", "application/x-www-form-urlencoded")
req.add_header('Authorization', encodeUserData(u, p))
# make the request and print the results
res = urllib2.urlopen(req)
print res.read()
또한 스크립트로 래핑하여 터미널에서 실행하면 응답 문자열을 'mjson'에 파이프로 연결할 수 있습니다.인쇄를 예쁘게 하려면 'tool'을 클릭합니다.
>> basicAuth.py | python -mjson.tool
마지막으로 urllib2는 GET 및 POST 요청만 지원합니다.
DELETE, PUT 등과 같은 다른 HTTP 동사를 사용해야 한다면 PYCURL을 살펴보고 싶을 것입니다.
그렇게 컬을 호출하는 명령을 사용하는 경우 파이썬에서 동일한 작업을 수행할 수 있습니다.subprocess예:
subprocess.call(['curl', '-i', '-H', '"Accept: application/xml"', '-u', 'login:key', '"https://app.streamsend.com/emails"'])
아니면 PycURL을 PHP가 가지고 있는 것처럼 더 구조화된 api로 가지고 싶다면 시도해 볼 수 있습니다.
import requests
url = 'https://example.tld/'
auth = ('username', 'password')
r = requests.get(url, auth=auth)
print(r.content)
이것이 제가 얻을 수 있는 가장 간단한 것입니다.
예를 들어, 설탕 구문을 사용하여 urlib를 사용하는 방법입니다.요청 및 기타 라이브러리에 대해서는 알고 있지만, urllib는 python의 표준 lib이며 별도로 설치할 필요가 없습니다.
Python 2/3 호환.
import sys
if sys.version_info.major == 3:
from urllib.request import HTTPPasswordMgrWithDefaultRealm, HTTPBasicAuthHandler, Request, build_opener
from urllib.parse import urlencode
else:
from urllib2 import HTTPPasswordMgrWithDefaultRealm, HTTPBasicAuthHandler, Request, build_opener
from urllib import urlencode
def curl(url, params=None, auth=None, req_type="GET", data=None, headers=None):
post_req = ["POST", "PUT"]
get_req = ["GET", "DELETE"]
if params is not None:
url += "?" + urlencode(params)
if req_type not in post_req + get_req:
raise IOError("Wrong request type \"%s\" passed" % req_type)
_headers = {}
handler_chain = []
if auth is not None:
manager = HTTPPasswordMgrWithDefaultRealm()
manager.add_password(None, url, auth["user"], auth["pass"])
handler_chain.append(HTTPBasicAuthHandler(manager))
if req_type in post_req and data is not None:
_headers["Content-Length"] = len(data)
if headers is not None:
_headers.update(headers)
director = build_opener(*handler_chain)
if req_type in post_req:
if sys.version_info.major == 3:
_data = bytes(data, encoding='utf8')
else:
_data = bytes(data)
req = Request(url, headers=_headers, data=_data)
else:
req = Request(url, headers=_headers)
req.get_method = lambda: req_type
result = director.open(req)
return {
"httpcode": result.code,
"headers": result.info(),
"content": result.read()
}
"""
Usage example:
"""
Post data:
curl("http://127.0.0.1/", req_type="POST", data='cascac')
Pass arguments (http://127.0.0.1/?q=show):
curl("http://127.0.0.1/", params={'q': 'show'}, req_type="POST", data='cascac')
HTTP Authorization:
curl("http://127.0.0.1/secure_data.txt", auth={"user": "username", "pass": "password"})
함수가 완전하지 않고 이상적이지 않을 수도 있지만 사용할 기본적인 표현과 개념을 보여줍니다.추가적인 것들은 취향에 따라 추가되거나 변경될 수 있습니다.
12/08 업데이트
라이브 업데이트 소스에 대한 GitHub 링크입니다.현재 지원되는 항목:
허가
CRUD 호환
자동 문자 집합 탐지
자동 인코딩(압축) 탐지
만약 당신이 찾고 있는 명령줄에서 위의 모든 것을 실행하고 있다면 HTTPie를 추천합니다.이것은 환상적인 cURL 대안이며 사용하기 매우 쉽고 편리합니다.
GitHub의 (명확하고 정확한) 설명은 다음과 같습니다.
HTTPie(aych-tee-tee-pie로 발음됨)는 명령줄 HTTP 클라이언트입니다.목표는 웹 서비스와의 CLI 상호 작용을 가능한 한 인간 친화적으로 만드는 것입니다.
단순하고 자연스러운 구문을 사용하여 임의의 HTTP 요청을 보낼 수 있는 간단한 http 명령을 제공하고 색상이 지정된 출력을 표시합니다.HTTPie는 테스트, 디버깅 및 일반적으로 HTTP 서버와 상호 작용하는 데 사용할 수 있습니다.
인증 관련 설명서는 문제를 해결할 수 있는 충분한 포인터를 제공합니다.물론 위의 모든 답변도 정확하며, 동일한 작업을 수행하는 다양한 방법을 제공합니다.
스택 오버플로에서 벗어날 필요가 없도록 간단히 설명하면 다음과 같습니다.
Basic auth:
$ http -a username:password example.org
Digest auth:
$ http --auth-type=digest -a username:password example.org
With password prompt:
$ http -a username example.org
언급URL : https://stackoverflow.com/questions/2667509/curl-alternative-in-python
'programing' 카테고리의 다른 글
| 날짜 시간을 날짜 시간 오프셋으로 캐스팅하는 방법은 무엇입니까? (0) | 2023.08.08 |
|---|---|
| Babel 7로 업그레이드: null의 '바인딩' 속성을 읽을 수 없습니다. (0) | 2023.08.08 |
| 파일에 대한 Oracle 스풀의 최대 열 너비 (0) | 2023.08.08 |
| 필드가 과거일 때 SQL 업데이트 레코드 (0) | 2023.08.08 |
| 패브릭을 통해 가상 환경을 배포 사용자로 활성화 (0) | 2023.08.08 |