有没有专门做蛋糕的网站,软件定制开发优势,中国核工业第五建设公司网站,微网站开发案例#x1f538; 第一部分#xff1a;requests库的入口
我们从requests库的入口开始#xff0c;通常我们会使用 requests.get() 或 requests.post() 等方法发送HTTP请求。那么#xff0c;这些方法背后究竟做了些什么呢#xff1f;我们从requests.get()方法开始看起#xff… 第一部分requests库的入口
我们从requests库的入口开始通常我们会使用 requests.get() 或 requests.post() 等方法发送HTTP请求。那么这些方法背后究竟做了些什么呢我们从requests.get()方法开始看起
# requests/__init__.py
def get(url, paramsNone, **kwargs):Sends a GET request.return request(get, url, paramsparams, **kwargs)requests.get() 实际上是调用了内部的 request() 方法并将 get 作为请求方法传入。让我们进一步深入 request() 方法。 第二部分request方法揭秘
在requests库中request() 方法负责构建和发送所有类型的HTTP请求
# requests/api.py
def request(method, url, **kwargs):session sessions.Session()return session.request(methodmethod, urlurl, **kwargs)request() 方法创建了一个 Session 对象然后调用了 session.request()。这意味着实际的请求处理是由 Session 对象完成的。 第三部分Session对象的奥秘
Session 对象在requests库中扮演了重要角色。它不仅可以发送请求还能保存cookie等会话信息
# requests/sessions.py
class Session(SessionRedirectMixin, RequestHookMixin):def request(self, method, url, paramsNone, dataNone, headersNone, cookiesNone, filesNone, authNone, timeoutNone, allow_redirectsTrue, proxiesNone, hooksNone, streamNone, verifyTrue, certNone, jsonNone):prep self.prepare_request(Request(methodmethod, urlurl, headersheaders, filesfiles, datadata, jsonjson, paramsparams, authauth, cookiescookies, hookshooks))...send_kwargs {timeout: timeout, allow_redirects: allow_redirects, proxies: proxies, stream: stream, verify: verify, cert: cert, hooks: hooks}...resp self.send(prep, **send_kwargs)return respSession 对象的 request() 方法中首先调用 prepare_request() 方法来构建 Request 对象。然后调用 send() 方法来发送请求。 第四部分Request对象的构建
prepare_request() 方法负责构建一个 Request 对象
# requests/sessions.py
def prepare_request(self, request):p PreparedRequest()p.prepare(methodrequest.method.upper(),urlrequest.url,filesrequest.files,datarequest.data,jsonrequest.json,headersrequest.headers,paramsrequest.params,authrequest.auth,cookiesrequest.cookies,hooksrequest.hooks,)return pprepare_request() 方法中调用了 PreparedRequest 类并通过其 prepare() 方法将请求的各个部分准备好。 第五部分PreparedRequest的准备
PreparedRequest 类是用来标准化和准备请求数据的
# requests/models.py
class PreparedRequest(RequestEncodingMixin, RequestHooksMixin):def prepare(self, methodNone, urlNone, headersNone, filesNone, dataNone, paramsNone, authNone, cookiesNone, hooksNone, jsonNone):self.prepare_method(method)self.prepare_url(url, params)self.prepare_headers(headers)self.prepare_body(data, files, json)self.prepare_auth(auth, url)self.prepare_cookies(cookies)self.prepare_hooks(hooks)PreparedRequest 类的 prepare() 方法中分别调用了一系列 prepare_* 方法来准备HTTP请求的各个部分如方法、URL、头信息、请求体等。 第六部分发送请求
当请求准备好后Session 对象的 send() 方法负责实际发送HTTP请求
# requests/sessions.py
def send(self, request, **kwargs):...r adapter.send(request, **kwargs)...return rsend() 方法中最重要的一步是调用 adapter.send() 方法这里的 adapter 是 HTTPAdapter 对象它负责底层的HTTP请求发送。 第七部分HTTPAdapter的发送
HTTPAdapter 对象的 send() 方法通过底层库如urllib3来实际发送请求
# requests/adapters.py
class HTTPAdapter(BaseAdapter):def send(self, request, streamFalse, timeoutNone, verifyTrue, certNone, proxiesNone):conn self.get_connection(request.url, proxies)...resp conn.urlopen(methodrequest.method,urlrequest.url,bodyrequest.body,headersrequest.headers,...)return self.build_response(request, resp)send() 方法通过 get_connection() 方法获取一个连接然后使用 conn.urlopen() 发送请求并调用 build_response() 方法构建响应对象。 第八部分构建响应
build_response() 方法负责将底层响应对象转换为 requests 的 Response 对象
# requests/adapters.py
def build_response(self, request, resp):response Response()response.status_code resp.statusresponse.headers CaseInsensitiveDict(resp.headers)response.raw respresponse.url request.urlresponse.request requestresponse.connection selfreturn responsebuild_response() 方法中将底层响应对象的状态码、头信息、URL等信息赋值给 Response 对象从而完成响应构建。 总结 通过以上解析我们了解了 requests 库从发送请求到接收响应的全过程。从 requests.get() 方法开始经过 Session 对象的处理、PreparedRequest 的准备、HTTPAdapter 的发送最终构建 Response 对象。这一系列流程确保了 requests 库能够简洁、高效地处理HTTP请求让开发者可以专注于业务逻辑的实现。
希望通过这次源码解析大家对 requests 库有了更深入的理解能够更好地运用它进行网络请求处理