mirror of
https://github.com/not-kennethreitz/python-for-humans.git
synced 2026-06-05 23:20:18 +00:00
169 lines
3.0 KiB
Markdown
169 lines
3.0 KiB
Markdown
!SLIDE bullets incremental
|
||
# This is a serious problem.
|
||
|
||
|
||
!SLIDE bullets incremental
|
||
# The Solution is Simple.
|
||
|
||
- Build elegant tools to perform these tasks.
|
||
- Provide a real resource for learning.
|
||
|
||
!SLIDE
|
||
## Python needs more Pragmatic Packages.
|
||
|
||
!SLIDE dark
|
||
|
||
## pra•gmat•ic |pragˈmatik|, *adj*:
|
||
Dealing with things sensibly and realistically in a way that is
|
||
based on practical rather than theoretical considerations.
|
||
|
||
!SLIDE
|
||
# An Examples.
|
||
|
||
### Let's mess around. Maybe play with the GitHub API?
|
||
!SLIDE
|
||
|
||
|
||
|
||
!SLIDE small code
|
||
|
||
@@@ ruby
|
||
require 'net/http'
|
||
require 'uri'
|
||
|
||
uri = URI.parse('https://api.github.com/user')
|
||
|
||
http = Net::HTTP.new(uri.host, uri.port)
|
||
http.use_ssl = true
|
||
|
||
req = Net::HTTP::Get.new(uri.request_uri)
|
||
req.basic_auth('username', 'password')
|
||
|
||
r = http.request(req)
|
||
|
||
puts r
|
||
|
||
## Let's port this to Python.
|
||
|
||
!SLIDE smaller code execute
|
||
# Python (hours later).
|
||
@@@ python
|
||
import urllib2
|
||
|
||
gh_url = 'https://api.github.com/user'
|
||
|
||
req = urllib2.Request(gh_url)
|
||
|
||
password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm()
|
||
password_manager.add_password(None, gh_url, 'user', 'pass')
|
||
|
||
auth_manager = urllib2.HTTPBasicAuthHandler(password_manager)
|
||
opener = urllib2.build_opener(auth_manager)
|
||
|
||
urllib2.install_opener(opener)
|
||
|
||
handler = urllib2.urlopen(req)
|
||
|
||
print handler.read()
|
||
|
||
!SLIDE smaller code execute
|
||
#I lied — there's more!
|
||
|
||
@@@ python
|
||
|
||
import re
|
||
|
||
class HTTPForcedBasicAuthHandler(HTTPBasicAuthHandler):
|
||
|
||
auth_header = 'Authorization'
|
||
rx = re.compile('(?:.*,)*[ \t]*([^ \t]+)[ \t]+'
|
||
'realm=(["\'])(.*?)\\2', re.I)
|
||
|
||
def __init__(self, *args, **kwargs):
|
||
HTTPBasicAuthHandler.__init__(self, *args, **kwargs)s
|
||
|
||
def http_error_401(self, req, fp, code, msg, headers):
|
||
url = req.get_full_url()
|
||
response = self._http_error_auth_reqed(
|
||
'www-authenticate', url, req, headers)
|
||
self.reset_retry_count()
|
||
return response
|
||
|
||
http_error_404 = http_error_401
|
||
|
||
!SLIDE
|
||
# Admit it.
|
||
|
||
If this was you, you'd leave Python and never come back.
|
||
|
||
|
||
!SLIDE
|
||
# Break it down.
|
||
|
||
|
||
|
||
!SLIDE
|
||
# Enter Requests.
|
||
|
||
|
||
|
||
!SLIDE
|
||
# The Codez, they are ugleh.
|
||
|
||
[trollface or something]
|
||
|
||
!SLIDE
|
||
## Unless there's an explicit requirement,
|
||
## a student should never see urllib2.
|
||
|
||
# No excuses.
|
||
|
||
!SLIDE
|
||
# Pragmatic Package.
|
||
|
||
@@@ python
|
||
import requests
|
||
|
||
url = 'https://api.github.com/user'
|
||
auth = ('username', 'password')
|
||
|
||
r = requests.get(url, auth=auth)
|
||
print r.content
|
||
|
||
|
||
!SLIDE
|
||
# Fit the 90% Use Case.
|
||
|
||
!SLIDE
|
||
# The API is all that matters.
|
||
|
||
## Everything else is secondary.
|
||
|
||
!SLIDE incremental bullets
|
||
# I Mean ***Everything***.
|
||
|
||
- Features.
|
||
- Efficiency.
|
||
- Performance.
|
||
- Corner-cases.
|
||
|
||
!SLIDE
|
||
# urllib2
|
||
|
||
"I'd rather be writing ColdFusion."
|
||
|
||
!SLIDE small
|
||
# subprocess
|
||
|
||
A powerful module that .
|
||
|
||
@@@ python
|
||
import envoy
|
||
|
||
c = envoy.run('ls')
|
||
.
|
||
|
||
@@@ pycon
|
||
>>> c.status_code
|
||
200
|