Keywords: Python | Requests | Proxy Disabling | Network Programming | session.trust_env
Abstract: This article provides a comprehensive exploration of methods to completely disable system proxies in the Python Requests library, with a focus on the technical principles of bypassing proxy configurations by setting session.trust_env=False. It explains how this approach works, its applicable scenarios, and potential impacts, including the ignoring of .netrc authentication information and CA certificate environments. Additionally, the article compares other proxy control methods, such as using the NO_PROXY environment variable and explicitly setting empty proxy dictionaries, offering thorough technical references and best practice recommendations.
Introduction
In network programming, the use of proxy servers is common, but certain scenarios require completely bypassing proxies to connect directly to target servers. Python's Requests library, as a widely-used HTTP client, offers flexible proxy configuration mechanisms. However, when system environment variables or configuration files set proxies, Requests defaults to using these configurations, which can lead to unexpected network behavior. Based on high-scoring Q&A from Stack Overflow, this article delves into how to completely disable proxies in Requests and explores related technical details.
Core Method: Using session.trust_env=False
To completely disable proxies in Requests, the most effective approach is to create a session and set its trust_env attribute to False. This method relies on Requests' internal implementation, avoiding automatic proxy application by ignoring environment variables and system configuration files. Here is a complete code example:
import requests
session = requests.Session()
session.trust_env = False
response = session.get('http://www.example.com')In this example, the requests module is imported first, then a Session object is created. By setting session.trust_env to False, the session no longer trusts proxy settings from environment variables and system configuration files. This means that even if HTTP_PROXY or HTTPS_PROXY environment variables are configured system-wide, Requests will connect directly to the target server without any proxy.
The principle behind this method lies in the Session class of Requests, which checks the trust_env attribute during initialization. If this attribute is False, it skips reading environment variables and configuration files, thus avoiding proxy configuration loading. Specifically, this affects the following aspects:
- Proxy settings: Ignores environment variables like HTTP_PROXY and HTTPS_PROXY.
- Authentication information: Ignores authentication information from the
.netrcfile, which typically stores FTP or HTTP credentials. - CA certificates: Ignores CA certificate bundles defined by
REQUESTS_CA_BUNDLEorCURL_CA_BUNDLEenvironment variables.
Therefore, when using this method, developers must ensure that functionalities dependent on these environment variables are handled elsewhere, such as manually setting authentication headers or specifying CA certificate paths.
Other Proxy Control Methods
Beyond completely disabling proxies, Requests offers other ways to control proxy behavior, suitable for different scenarios.
Using the NO_PROXY Environment Variable
If proxies need to be disabled only for specific domains, the NO_PROXY environment variable can be used. This method allows developers to specify a list of domains for which requests will bypass proxies. For example:
import os
import requests
os.environ['NO_PROXY'] = 'example.com,localhost'
response = requests.get('http://www.example.com')In this example, the NO_PROXY environment variable is set to example.com,localhost, meaning requests to these domains will connect directly without using proxies. This approach is useful in mixed environments where some requests require proxies and others do not.
Explicitly Setting Empty Proxy Dictionaries
Another method is to explicitly pass an empty proxy dictionary in requests. This can be achieved via the proxies parameter, setting proxies to empty strings to override default configurations:
import requests
proxies = {
"http": "",
"https": "",
}
response = requests.get("http://example.org", proxies=proxies)This method directly specifies empty proxies, suitable for temporarily disabling proxies for individual requests. However, it may not fully override all environment variable settings in some system configurations, making it less thorough than session.trust_env=False in certain cases.
Technical Details and Considerations
When implementing proxy disabling, several key points should be noted:
- Session reuse: When using
session.trust_env=False, it is advisable to reuse the same Session object for better performance, as creating new sessions reinitializes environment settings each time. - Error handling: If network connections fail after disabling proxies, check firewall or DNS settings, as proxies might have been used to bypass these restrictions.
- Compatibility: The
trust_envattribute is available in all versions of Requests, but behavior may vary slightly; testing in the target environment is recommended.
Additionally, developers should understand the security implications of these methods. Disabling proxies might expose internal network traffic, so careful evaluation is necessary in production environments. Also, ignoring CA certificate environment variables could lead to SSL/TLS verification issues, requiring manual configuration of certificate paths to ensure secure connections.
Conclusion
There are multiple methods to disable proxies in the Python Requests library, with setting session.trust_env=False being the most thorough approach for scenarios requiring complete bypass of system proxies. This article has detailed the working principles, code examples, and related considerations of this method, while comparing other proxy control techniques. By appropriately selecting and applying these methods, developers can manage network requests more flexibly to meet various application needs. In practice, it is recommended to choose the most suitable strategy based on specific scenarios and conduct thorough testing to ensure correct and secure network behavior.