νμ¬ requests.get(url, params=kwargs)
μ¬μ©ν λ socket.error: [Errno 54] Connection reset by peer
μ€λ₯κ° λ°μνκ³ params
ν° ν
μ€νΈ λ³Έλ¬Έμ΄ ν¬ν¨λμ΄ μμ΅λλ€. λ κ°μ ν° ν
μ€νΈ λ³Έλ¬Έμ κ°κ° 2,900μ λ―Έλ§μΌλ‘ μλ₯΄λ©΄ μλν©λλ€. curl
μ¬μ©νμ¬ λͺ
λ Ήμ€μμ λμΌν get μμ²μ μ€ννλ©΄ μλν©λλ€. pip install python-requests
μ¬μ©νμ¬ μ€μΉν μμ² λ²μ 0.6.1μ μ¬μ©νκ³ μμ΅λλ€.
λλ python-sendgrid λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ λ΄ sendgrid κ³μ μ λ΄μ€λ ν°λ₯Ό μΆκ°νκ³ μκ³ λ¬Έμ ν°μΌμ λ΄ API μ¬μ©μ μ΄λ¦κ³Ό λΉλ°λ²νΈλ₯Ό κ²μνκ³ μΆμ§ μκΈ° λλ¬Έμ λ¬Έμ λ₯Ό 볡μ νλΌλ λ§μ μ΄λ»κ² ν΄μΌ ν μ§
curlμ μ¬μ©νμ¬ λͺ λ Ήμ€μμ ν μ€νΈνκΈ° μν΄ κ°κ° urlencoderλ₯Ό μ¬μ©νμ¬ urlencoded μΌλ° ν μ€νΈμ html ν μ€νΈλ₯Ό ν¬ν¨νλ λ κ°μ νμΌμ λ§λ€μμ΅λλ€. κ·Έλ° λ€μ λ€μ λͺ λ Ήμ μ€ννμ΅λλ€.
export IDENTITY='<my identity number>'
export API_KEY='<my smtp password>'
export API_USER='<my smtp username>'
export NAME='<My Urlencoded Newsletter Name>'
export SUBJECT='<My Urlencoded Newsletter Subject>'
TEXT=`cat urlencoded.txt`; HTML=`cat urlencoded.html`; curl -d "api_user=$API_USER&api_key=$API_KEY&identity=$IDENTITY&name=$NAME&subject=$SUBJECT&text=$TEXT&html=$HTML" https://sendgrid.com/api/newsletter/newsletter/add.json
ν , ν₯λ―Έλ‘κ΅°. κ·Έκ²μ΄ λ°μνλ μ€λ₯λΌλ©΄, μλ²κ° μ€μ λ‘ μ°κ²°μ μ¬μ€μ νμ§ _μλλ€_λΌκ³ λ―Ώμ μ΄μ κ° κ±°μ μμ΅λλ€.
Charlesμ κ°μ HTTP νλ‘μλ₯Ό μ¬μ©ν μ μμ΅λκΉ? μ€μ λ‘ λ¬΄μ¨ μΌμ΄ μΌμ΄λκ³ μλμ§ λ°ν μ μμ΅λλ€.
μ£μ‘ν©λλ€. μ 체 μμΆμ μ μ 곡νλ κ²μ μμμ΅λλ€. λ€μμ μ€λ₯κ° λ°μνμ λ μ»λ μμΆμ μ λλ€. λν HTTP νλ‘μλ₯Ό μ¬μ©νλ λ°©λ²κ³Ό curlμ΄ μλ λͺ λ Ήμ€μμ μλν λ μ°¨μ΄κ° λλ μ΄μ λ₯Ό μ΄ν΄νμ§ λͺ»ν©λλ€.
Traceback (most recent call last):
File "/Users/oconnor/.virtualenvs/emails/bin/django-admin.py", line 5, in <module>
management.execute_from_command_line()
File "/Users/oconnor/.virtualenvs/emails/lib/python2.7/site-packages/django/core/management/__init__.py", line 429, in execute_from_command_line
utility.execute()
File "/Users/oconnor/.virtualenvs/emails/lib/python2.7/site-packages/django/core/management/__init__.py", line 379, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/Users/oconnor/.virtualenvs/emails/lib/python2.7/site-packages/django/core/management/base.py", line 191, in run_from_argv
self.execute(*args, **options.__dict__)
File "/Users/oconnor/.virtualenvs/emails/lib/python2.7/site-packages/django/core/management/base.py", line 220, in execute
output = self.handle(*args, **options)
File "/Users/oconnor/Sites/wenworld/emails/emails/management/commands/ww_daily_headlines_send.py", line 114, in handle
self.add_newsletter_to_sendgrid(sendgrid_newsletter_name, NEWSLETTER_SLUG)
File "/Users/oconnor/Sites/wenworld/emails/emails/management/commands/ww_daily_headlines_send.py", line 94, in add_newsletter_to_sendgrid
html=email.html
File "/Users/oconnor/.virtualenvs/emails/src/sendgrid/src/sendgrid/__init__.py", line 67, in newsletter_add
subject=subject, text=text, html=html)
File "/Users/oconnor/.virtualenvs/emails/src/sendgrid/src/sendgrid/__init__.py", line 157, in get
return self.call(method, **kwargs)
File "/Users/oconnor/.virtualenvs/emails/src/sendgrid/src/sendgrid/__init__.py", line 56, in call
result_json = json.loads(response.content)
File "/Users/oconnor/.virtualenvs/emails/lib/python2.7/site-packages/requests/models.py", line 429, in __getattr__
self._content = self.read()
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 351, in read
data = self._sock.recv(rbufsize)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 553, in read
s = self.fp.read(amt)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 1276, in read
return s + self._file.read(amt - len(s))
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 380, in read
data = self._sock.recv(left)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py", line 219, in recv
return self.read(buflen)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py", line 138, in read
return self._sslobj.read(len)
socket.error: [Errno 54] Connection reset by peer
githubμμ λμμ¨ μλ΅μ...
<html>
<head><title>414 Request-URI Too Large</title></head>
<body bgcolor="white">
<center><h1>414 Request-URI Too Large</h1></center>
<hr><center>nginx/0.7.65</center>
</body>
</html>
μ΄μ μ μΈκΈνλ―μ΄ curl
μλνκΈ° λλ¬Έμ μ΄μν©λλ€.
Charles(λλ μ΄μ μ μ¬ν)λ₯Ό ν΅ν΄ λ κ°μ§ μμ²μ μ΄ν΄λ³΄λ λ° μκ°μ λ€μ΄λ©΄ λ¬Έμ λ₯Ό λ§€μ° λΉ¨λ¦¬ νμΈν μ μμ κ²μ λλ€.
μ€λ₯μμ μ μ μλ―μ΄ Request-URIκ° λ무 컀μ μλ²κ° μ²λ¦¬ν μ μμΌλ―λ‘ μ°κ²°μ΄ λμ΄μ§λλ€.
μμ²μ μ¬μ©νλ©΄ λͺ¨λ λ°μ΄ν°λ₯Ό GET 맀κ°λ³μλΌκ³ νλ μμ² URIμ λκ·λͺ¨ 쿼리 λ¬Έμμ΄λ‘ 보λ λλ€. curlμ μ¬μ©νλ κ²½μ° μμ μΈμ½λ© λ°μ΄ν°λ₯Ό POST λ°μ΄ν°λΌκ³ νλ μμ² λ³Έλ¬Έμ μ λ‘λν©λλ€.
requests.get(url, params=kwargs)
λ° requests.post(url, params=kwargs)
λ₯Ό λͺ¨λ μ¬μ©νλ €κ³ μλνμ§λ§ λ λ€ λμΌν μ€λ₯λ₯Ό λ°νν©λλ€. μ΄λ€ μ΄μ λ‘ Charlesλ curlμμ μμ²μ μΊ‘μ²νμ§ μκ³ python-requestsλ₯Ό μ¬μ©νλ λ΄ λΈλΌμ°μ μ λ΄ python λͺ
λ Ήμ€ μ€ν¬λ¦½νΈμμ μμ²μ μΊ‘μ²νκ³ μμ΅λλ€.
κ±±μ λ§.
params
λ 쿼리 λ¬Έμμ΄μ©μ΄κ³ data
λ POST λ°μ΄ν°μ©μ
λλ€.
λ¬μ½€ν μ‘μ
! requests.get(url, params=kwargs)
μμ requests.post(url, data=kwargs)
νλ©΄ λ¬Έμ κ° ν΄κ²°λμμ΅λλ€! λ²κ±°λ‘κ² ν΄μ μ£μ‘νκ³ λμμ£Όμ
μ κ°μ¬ν©λλ€!
μ ν κ±±μ νμ§ λ§μΈμ :)
λΉμ·ν λ°μ΄ν°λ‘ λμΌν μ€λ₯κ° λ°μνλ κ²μ΄ μ΄μν©λλ€. μ μΌν μ°¨μ΄μ μ μ κ²½μ°μλ ν° λͺ©λ‘μ΄λ λ§€κ° λ³μ ν¬κΈ°κ° μλ€λ κ²μ λλ€. CURLμ ν΅ν΄ μ΄λ£¨μ΄μ§ λμΌν μμ²μ μ λλ‘ μλνμ§λ§ μμ²μ ν΅ν΄ μ΄ μ€λ₯κ° λ°μν©λλ€.
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='barnea.com', port=443): URLλ‘ μ΅λ μ¬μλ νμ μ΄κ³Ό: /jira/rest/api/2/group?groupname=jira-administrators&expand=users
λ ν₯λ―Έλ‘μ΄ κ²μ μμ²μ΄ μΉ μλ²μ λλ¬νμ§λ μλ κ² κ°μ΅λλ€.
μ΄λ€ μμΈμ΄ λ μ μμ΅λκΉ?
@ssbarnea μ΄ λ¬Έμ λ 2λ μ΄
λ λμ λ°©λ²μ λ¬Έμ λ₯Ό μ΄μ§ λ§κ³ StackOverflowμ κ°μ μ§λ¬Έμ νκ³ μλλ° μ΄κ²μ΄ μμ² λμ λ°©μμ λ¬Έμ λΌκ³ λ―Ώμ μ΄μ κ° μλ€λ κ²μ λλ€. StackOverflowμ λν μΈλΆ μ 보λ₯Ό ν΄μ μ²λ¦¬νλ©΄ λ²κ·Έ λ³΄κ³ μλ₯Ό μ μΆν μ μμ΅λλ€(νμν κ²½μ°).
κ·Έκ²μ λ§€μ° μ΄μν νλμ΄λ©° μμ²μ λ²κ·Έκ° μλλΌκ³ λ―Ώμ μ΄μ κ° μμ΅λλ€. κ·Έλμ μ λ²κ·Έλ₯Ό μ΄μμ΅λλ€. λλ μ¬μ ν μ΄κ²μ μΌμΌν¬ μ μλ μμΈμ μ‘°μ¬νκ³ μμ΅λλ€. λ΄ μ»΄ν¨ν°μμλ§ λ°μνμ§λ§ κ°μ₯ ν₯λ―Έλ‘μ΄ λΆλΆμ CURLμ΄ μλνλ€λ κ²μ λλ€(λΈλΌμ°μ λ λ§μ°¬κ°μ§). κ°μ¬ν©λλ€.
μ΄κ²μ μ¬κΈ°μ λμ΄μ μ£μ‘νμ§λ§ μμΈμ μ°Ύμμ΅λλ€.
# resolver 127.0.0.1;
# ssl_protocols TLSv1.2 TLSv1.1 ; # TLSv1
# ssl_stapling on;
# ssl_stapling_verify on;
# ssl_session_cache builtin:1000;
# ssl_session_timeout 30m;
# ssl_ciphers HIGH:!RC4:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
nginx μλ²μμ μ΄λ¬ν μ‘°μ μ λΉνμ±ννλ©΄ μμ²κ³Ό ν¨κ» μλνκΈ° μμνμ΅λλ€. λΆλͺ ν κ·Έ μ€ νλκ° μ€μλμ μΌμΌν€λ κ²μ λλ€.
@ssbarnea
#1567(λ° κ·Έ μ΄μ)μ μ€λͺ
λ κ²μ²λΌ νΉμ SSL/TLS λ²μ μμ λ§ν λ μλͺ»λ μμ
μ μννλ λ²κ·Έκ° μλ μλ²μΌ κ°λ₯μ±μ΄ ν½λλ€.
μ¬κΈ° μ μ€λͺ
λ κ²μ²λΌ λ€λ₯Έ λ²μ μ κ°μ μ€νν΄ λ³΄μμμ€(@Lukasaμκ² λ λ§μ μ°¬μ¬).
κ·Έλ¦¬κ³ μΉμ(ν¨μ)λ ssl_protocols TLSv1.2 TLSv1.1;
μλ²μμ μ§μλλ νλ‘ν μ½μμ TLSv1
λ₯Ό μ κ±°νλ©΄ μμ²μ΄ μλνμ§ μλ κ² κ°μ΅λλ€.
μ΄μ μμ²μ΄λ κΈ°λ³Έ λΌμ΄λΈλ¬λ¦¬μμ μ΄κ²μ λ²κ·ΈλΌκ³ λΆλ₯Ό μ μμ΅λκΉ?
μ°Έκ³ : 보μ λ¬Έμ λ‘ μΈν΄ TLSv1μ μ κ±°νλ κ²μ΄ μ’μ΅λλ€. μ μ©μ΄ μμ΅λλ€.
@ssbarnea μ ν μ¬νμ΄ μμ²μ΄ μλλΌ Pythonμ μμμ μ μ μμ΅λλ€. νμ¬ μ 곡λλ Python λ²μ μ μ¬κΈ° ν
Python 3.4(μμ§ μ 곡λμ§ μμ, Requestsκ° νΈνλλ€λ 보μ₯ μμ)μμλ TLS1.2 λ° TLS1.1μ μ§μνλ―λ‘ μλν΄ λ³Ό μ μμ΅λλ€. κ·Έλ μ§ μμΌλ©΄ TLSv1μ΄ μμ²μ ν΅κ³Όνλλ‘ νμ©ν΄μΌ ν©λλ€.
μ¬μ ν μ΄μν μ μ΄ μμ΅λλ€. λ κ²½μ° λͺ¨λ Pythonμ μ¬μ©νλλ° OS Xμμ ν μ€νΈν λλ μ€ν¨νκ³ Ubuntuμμ ν μ€νΈνμ λλ μλνμ΅λλ€.
μΌλ°μ μΌλ‘ SSLμ κΈ°λ³Έ μ€μ μ 건λλ¦¬μ§ μμ§λ§ SSL λ³΄κ³ μλ₯Ό μ€ννκ³ λλΆλΆμ κ²½κ³ λ₯Ό ν΄κ²°νλ €κ³ νμ΅λλ€.
FIPS μꡬ μ¬ν: SSL v2 λ° SSL v3 λΉνμ±ν(TLS λ²μ νλ‘ν μ½λ§ μ¬μ©)
BEAST 곡격μ λν΄μλ μ½μ΄λ³΄μμμ€.
μ¬κΈ°μμ νμΈνμμμ€:
https://sslcheck.globalsign.com/en_US/sslcheck/?host=sbarnea.com
κ·Έλμ μ΄κ²μ κ³ μΉ μ μλμ§ κΆκΈν©λλ€. λΆλͺ ν Ubuntuμ Pythonκ³Ό ν¨κ» μλνλ€λ©΄ λͺ¨λ Python λ²μ μ κ΅νλ μλ μμ΅λλ€.
μ, μ¬νκ²λ κ·Έλ΄ μ μμ΅λλ€. ssl
μ§μμ μλμ κΈ°λ₯μ μ€μΉν OpenSSL λ²μ μ λ°λΌ λ€λ¦
λλ€. λ λ²μ μ λΉκ΅νμμμ€. =)
μ£Όμ μ λν΄ μ½κ°μ λ§λ¬΄λ¦¬λ₯Ό μ 곡ν©λλ€. μΉ μλ²κ° TLSv1μ νμ©νμ§ μμΌλ©΄ Python 2.7.9κ° ν¬ν¨λ TLSv1.1 λ° 1.2λ₯Ό λ°κ² λ©λλ€(2014λ 12μ μμ ). κ·Έλ¬λ PYOpenSSLμ μ€μΉνκ³ μ΄λ₯Ό urrlib3(http://urllib3.readthedocs.org/en/latest/security.html#openssl-pyopenssl)μ μ½μ ν μλ μμ΅λλ€. μ΄λ Pythonμμ TLSv1μ λΉνμ±νν μΉ μλ²μ λν μμ²μ μ¬μ©ν μ μκ² ν΄μ£Όλ κ² κ°μ΅λλ€. 2.7.6(κ·Έλ¦¬κ³ μλ§λ λ€λ₯Έ κ²λ€).
import urllib3.contrib.pyopenssl
urllib3.contrib.pyopenssl.inject_into_urllib3()
κ·Έλ¬λ μ€μ λ‘ μΉ μλ²λ μ¬λλ€μ΄ μ΄ λ§μ μ΄μν κ³ λ¦¬λ₯Ό 건λλ°λλ‘ κ°μνλ 무μΈκ°λ₯Ό λΉμΆμ²ν΄μλ μ λ©λλ€.
κ°μ₯ μ μ©ν λκΈ
λ¬μ½€ν μ‘μ !
requests.get(url, params=kwargs)
μμrequests.post(url, data=kwargs)
νλ©΄ λ¬Έμ κ° ν΄κ²°λμμ΅λλ€! λ²κ±°λ‘κ² ν΄μ μ£μ‘νκ³ λμμ£Όμ μ κ°μ¬ν©λλ€!