æè¿è¦ç¨ Python 模æè¡¨åä¸ä¼ æä»¶ï¼æç´¢äºä¸ä¸å¸¸è§çè§£å³æ¹æ¡ã
Â Â Â Â å¦æåªæ¯è¦æ¨¡ææäº¤ä¸ä¸ªä¸å 嫿件忮µç表åï¼å®ç°èµ·æ¥æ¯å¾ç®åçï¼ä½æ¶åå°æä»¶ä¸ä¼ å°±æä¸ç¹å°å¤æï¼éè¦èªå·±å¯¹æä»¶è¿è¡ç¼ç ï¼æè 使ç¨ç¬¬ä¸æ¹æ¨¡åã
ãã妿æºå¨ä¸æÂ PycURLï¼é£ä¹å¯ä»¥ä½¿ç¨ PycURL æ¥ä¸ä¼ æä»¶ã
ããä¸è¿ï¼ç±äº PycURL éè¦ç¨å° curlï¼å¨ Windows ä¸å®è£ å¯è½ä¼æç¹éº»ç¦ï¼é¤ PycURL å¤ï¼ä¹æä¸äºå ¶å®å®ç° POST æä»¶ä¸ä¼ çæ¹å¼ï¼æ¯å¦Â è¿å¿Â ç 2 楼æäººè´´åºäºä¸ä¸ªå°æä»¶è¿è¡ç¼ç ä¹åå POST çæ¹æ³ï¼å¦å¤è¿æMultipartPostHandlerãurllib2_fileãposter çç¬¬ä¸æ¹æ¨¡åãä½ MultipartPostHandler è¿ä¸ªæ¨¡å似乿¯è¾èäºï¼urllib2_file æè¯ç¨äºä¸ä¸éå°é误没ææåï¼è¿å¿ææ³ä»ç»çæ¯å¦å¤ä¸ä¸ªç¬¬ä¸æ¹æ¨¡å posterã
ãã妿æºå¨ä¸å®è£ äº Python ç setuptoolsï¼å¯ä»¥éè¿ä¸é¢çå½ä»¤æ¥å®è£ posterï¼
sudo easy_install poster
# test_client.py
from poster.encode import multipart_encode
from poster.streaminghttp import register_openers
import urllib2
# å¨ urllib2 䏿³¨å http æµå¤ç奿
register_openers()
# å¼å§å¯¹æä»¶ "DSC0001.jpg" ç multiart/form-data ç¼ç
# "image1" æ¯åæ°çååï¼ä¸è¬éè¿ HTML ä¸ç <input> æ ç¾ç name åæ°è®¾ç½®
# headers å
å«å¿
é¡»ç Content-Type å Content-Length
# datagen æ¯ä¸ä¸ªçæå¨å¯¹è±¡ï¼è¿åç¼ç è¿åçåæ°ï¼è¿é妿æå¤ä¸ªåæ°çè¯ä¾æ¬¡æ·»å å³å¯
datagen, headers = multipart_encode({"image1": open("DSC0001.jpg", "rb")})
# å建请æ±å¯¹è±¡
request = urllib2.Request("http://localhost:5000/upload_image", datagen, headers)
# å®é
æ§è¡è¯·æ±å¹¶åå¾è¿å
print urllib2.urlopen(request).read()
å¾ç®åï¼æä»¶å°±ä¸ä¼ 宿äºã
å ¶ä¸é£ä¸ª register_openers() ç¸å½äºä»¥ä¸æä½ï¼
from poster.encode import multipart_encode
from poster.streaminghttp import StreamingHTTPHandler, StreamingHTTPRedirectHandler, StreamingHTTPSHandler
handlers = [StreamingHTTPHandler, StreamingHTTPRedirectHandler, StreamingHTTPSHandler]
opener = urllib2.build_opener(*handlers)
urllib2.install_opener(opener)
å¦å¤ï¼poster ä¹å¯ä»¥æºå¸¦ cookieï¼æ¯å¦ï¼
opener = poster.streaminghttp.register_openers()
opener.add_handler(urllib2.HTTPCookieProcessor(cookielib.CookieJar()))
params = {'file': open("test.txt", "rb"), 'name': 'upload test'}
datagen, headers = poster.encode.multipart_encode(params)
request = urllib2.Request(upload_url, datagen, headers)
result = urllib2.urlopen(request)
妿å¨ä¸ä¼ è¿ç¨ä¸éå°Authorizationé®é¢ï¼å¯ä»¥èªå·±å®ä¹register_openers()æ¹æ³å å ¥ç¨æ·éªè¯çhandlerï¼ä¾å¦ï¼
from poster.encode import multipart_encode
from poster.streaminghttp import StreamingHTTPHandler, StreamingHTTPRedirectHandler, StreamingHTTPSHandler
# create a password manager
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
# Add the username and password.
# If we knew the realm, we could use it instead of None.
# add_password('realm','url','username','password')
password_mgr.add_password('realm', 'url', 'username', 'password')
handler = urllib2.HTTPBasicAuthHandler(password_mgr)
handlers = [handler,StreamingHTTPHandler, StreamingHTTPRedirectHandler, StreamingHTTPSHandler]
opener = urllib2.build_opener(*handlers)
urllib2.install_opener(opener)
æè ç´æ¥å°ä¸é¢çå 容å å°ä¸ä¼ æä»¶ç代ç ä¸ã
ä»å¤©çªç¶å¾çä¸è½ä¸ä¼ äºï¼åç°ä¸é¢çè®¤è¯æ¹å¼å¤±æäºã徿¯å¥æªãäºæ¯åæ¥ä¸ç§è§£å³æ¹æ¡ã
å ¶å®é®é¢å°±æ¯è§£å³pythonç¯å¢ä¸HTTP Basic Authorization  çé®é¢
é¦å æä»¬è¦çè§£HTTPåºæ¬è®¤è¯çåç
å¨HTTPä¸ï¼
åºæ¬è®¤è¯æ¯ä¸ç§ç¨æ¥å 许Webæµè§å¨æå ¶ä»å®¢æ·ç«¯ç¨åºå¨è¯·æ±æ¶æä¾ç¨æ·ååå£ä»¤å½¢å¼ç身份åè¯çä¸ç§ç»å½éªè¯æ¹å¼ã
å¨åéä¹åæ¯ä»¥ç¨æ·å追å ä¸ä¸ªåå·ç¶å串æ¥ä¸å£ä»¤ï¼å¹¶å°å¾åºçç»æå符串åç¨Base64ç®æ³ç¼ç ãä¾å¦ï¼æä¾çç¨æ·åæ¯Aladdinãå£ä»¤æ¯open sesameï¼åæ¼æ¥åçç»æå°±æ¯Aladdin:open sesameï¼ç¶ååå°å ¶ç¨Base64ç¼ç ï¼å¾å°QWxhZGRpbjpvcGVuIHNlc2FtZQ==ãæç»å°Base64ç¼ç çå符串åéåºå»ï¼ç±æ¥æ¶è è§£ç å¾å°ä¸ä¸ªç±åå·åéçç¨æ·ååå£ä»¤çå符串ã
è½ç¶å¯¹ç¨æ·ååå£ä»¤çBase64ç®æ³ç¼ç ç»æå¾é¾ç¨èç¼è¯å«è§£ç ï¼ä½å®ä»å¯ä»¥æä¸ºè½»æ¾å°è¢«è®¡ç®æºæè§£ç ï¼å°±åå ¶å®¹æç¼ç 䏿 ·ãç¼ç è¿ä¸æ¥éª¤çç®ç并䏿¯å®å ¨ä¸éç§ï¼èæ¯ä¸ºå°ç¨æ·ååå£ä»¤ä¸çä¸å ¼å®¹çå符转æ¢ä¸ºåä¸HTTPåè®®å ¼å®¹çå符éã
ä¾å
è¿ä¸ä¸ªå ¸åçHTTP客æ·ç«¯åHTTPæå¡å¨ç对è¯ï¼æå¡å¨å®è£ å¨åä¸å°è®¡ç®æºä¸ï¼localhostï¼ï¼å å«ä»¥ä¸æ¥éª¤ï¼
- 客æ·ç«¯è¯·æ±ä¸ä¸ªéè¦èº«ä»½è®¤è¯ç页é¢ï¼ä½æ¯æ²¡ææä¾ç¨æ·ååå£ä»¤ãè¿é常æ¯ç¨æ·å¨å°åæ è¾å ¥ä¸ä¸ªURLï¼ææ¯æå¼äºä¸ä¸ªæå该页é¢ç龿¥ã
- æå¡ç«¯ååºä¸ä¸ª401åºçç ï¼å¹¶æä¾ä¸ä¸ªè®¤è¯åã
- æ¥å°åºçåï¼å®¢æ·ç«¯æ¾ç¤ºè¯¥è®¤è¯åï¼éå¸¸æ¯æè®¿é®çè®¡ç®æºæç³»ç»çæè¿°ï¼ç»ç¨æ·å¹¶æç¤ºè¾å ¥ç¨æ·ååå£ä»¤ãæ¤æ¶ç¨æ·å¯ä»¥éæ©ç¡®å®æåæ¶ã
- ç¨æ·è¾å ¥äºç¨æ·ååå£ä»¤åï¼å®¢æ·ç«¯è½¯ä»¶ä¼å¨åå ç请æ±ä¸å¢å è®¤è¯æ¶æ¯å¤´ï¼å¼æ¯base64encode(username+":"+password)ï¼ï¼ç¶åéæ°åé忬¡å°è¯ã
- 卿¬ä¾ä¸ï¼æå¡å¨æ¥åäºè¯¥è®¤è¯å±å¹å¹¶è¿åäºé¡µé¢ãå¦æç¨æ·åæ®éæ³ææ æï¼æå¡å¨å¯è½å次è¿å401åºçç ï¼å®¢æ·ç«¯å¯ä»¥å次æç¤ºç¨æ·è¾å ¥å£ä»¤ã
客æ·ç«¯æå¯è½ä¸éè¦ç¨æ·äº¤äºï¼å¨ç¬¬ä¸æ¬¡è¯·æ±ä¸å°±åéè®¤è¯æ¶æ¯å¤´ã
客æ·ç«¯è¯·æ±ï¼æ²¡æè®¤è¯ä¿¡æ¯ï¼ï¼
GET /private/index.html HTTP/1.0
Host: localhost
ï¼è·éä¸ä¸ªæ¢è¡ ï¼ä»¥å车ï¼CRï¼ å æ¢è¡ï¼LFï¼ çå½¢å¼ï¼
æå¡ç«¯åºçï¼
HTTP/1.0 401 Authorization Required
Server: HTTPd/1.0
Date: Sat, 27 Nov 2004 10:18:15 GMT
WWW-Authenticate: Basic realm="Secure Area"
Content-Type: text/html
Content-Length: 311
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<HTML>
<HEAD>
<TITLE>Error</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1">
</HEAD>
<BODY><H1>401 Unauthorized.</H1></BODY>
</HTML>
客æ·ç«¯ç请æ±ï¼ç¨æ·åâ"Aladdinâï¼å£ä»¤, password âopen sesameâï¼ ï¼
GET /private/index.html HTTP/1.0
Host: localhost
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
ï¼è·éä¸ä¸ªç©ºè¡ï¼å¦ä¸æè¿°ï¼
Authorizationæ¶æ¯å¤´çç¨æ·ååå£ä»¤çå¼å¯ä»¥å®¹æå°ç¼ç åè§£ç ï¼
æå¡ç«¯çåºçï¼
HTTP/1.0 200 OK
Server: HTTPd/1.0
Date: Sat, 27 Nov 2004 10:19:07 GMT
Content-Type: text/html
Content-Length: 10476
æä»¥ï¼ç¨pythonè§£å³é®é¢çè¯ï¼
import urllib2
import sys
import re
import base64
from urlparse import urlparse
theurl = 'http://api.minicloud.com.cn/statuses/friends_timeline.xml'
username = 'qleelulu'
password = 'XXXXXX' # ä½ ä¿¡è¿æ¯å¯ç åï¼
base64string = base64.encodestring(
'%s:%s' % (username, password))[:-1] #注æå¦ï¼è¿éæåä¼èªå¨æ·»å ä¸ä¸ª\n
authheader = "Basic %s" % base64string
req.add_header("Authorization", authheader)
try:
handle = urllib2.urlopen(req)
except IOError, e:
# here we shouldn't fail if the username/password is right
print "It looks like the username or password is wrong."
sys.exit(1)
thepage = handle.read()
å°±æ¯å¨headerä¸å ä¸ï¼
base64string = base64.encodestring('username:password')[:-1]
authheader = "Basic %s" % base64string
headers['Authorization'] = authheader
ræ¡åå请æ±å°±å¯ä»¥äºã åçå°±æ¯æ·»å äºè¯·æ±å¤´Authorizationã
çæå£°æï¼æ¬æä¸ºCSDNå主ãweixin_34041003ãçååæç« ï¼éµå¾ªCC 4.0 BY-SAçæåè®®ï¼è½¬è½½è¯·éä¸åæåºå¤é¾æ¥åæ¬å£°æã
åæé¾æ¥ï¼https://blog.csdn.net/weixin_34041003/article/details/91572565