Master professional Python: HTTP requests, application logging, and command-line interfaces.
Build real-world applications with networking, logging, and CLI tools.
requests library and built-in urllib.import requests
# Simple GET request
response = requests.get('https://api.github.com/users/python')
print(response.status_code) # 200
print(response.json()) # Parse JSON response
# With query parameters
params = {'q': 'python', 'sort': 'stars'}
response = requests.get('https://api.github.com/search/repos', params=params)
# With headers
headers = {'Authorization': 'token YOUR_TOKEN'}
response = requests.get(url, headers=headers)# POST with JSON data
data = {'name': 'test', 'value': 123}
response = requests.post('https://httpbin.org/post', json=data)
# POST with form data
form_data = {'username': 'alice', 'password': 'secret'}
response = requests.post(url, data=form_data)
# Check response
if response.ok:
print(response.json())
else:
print(f"Error: {response.status_code}")response = requests.get(url)
# Response attributes
print(response.status_code) # 200
print(response.headers) # Response headers
print(response.text) # Raw text content
print(response.json()) # Parse as JSON
print(response.content) # Raw bytes
# Check for errors
response.raise_for_status() # Raises exception on 4xx/5xx# Using sessions (maintains cookies)
session = requests.Session()
session.headers.update({'User-Agent': 'MyApp/1.0'})
response = session.get('https://example.com/login')
response = session.post('https://example.com/data')
# Timeout handling
try:
response = requests.get(url, timeout=5)
except requests.Timeout:
print("Request timed out")
except requests.RequestException as e:
print(f"Request failed: {e}")response.ok before parsingrequests needs to be installed: pip install requestsStatus: 200
Response: {'login': 'python', 'id': 1525981, ...}
Request successful!
import requestsrequests.get(url)response.status_code or response.okresponse.json()requests.get(url, timeout=5)Review feedback below
logging module for professional application logging.import logging
# Basic configuration
logging.basicConfig(level=logging.DEBUG)
# Log at different levels
logging.debug('Debug message') # Detailed info
logging.info('Info message') # General info
logging.warning('Warning!') # Something unexpected
logging.error('Error occurred') # Error but recoverable
logging.critical('Critical!') # Program may crash# Custom format
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
logging.info('Application started')
# Output: 2024-01-15 10:30:00 - root - INFO - Application started
# Format specifiers:
# %(asctime)s - Timestamp
# %(name)s - Logger name
# %(levelname)s - Level (DEBUG, INFO, etc.)
# %(message)s - Log message
# %(filename)s - Source file
# %(lineno)d - Line number# Log to file
logging.basicConfig(
filename='app.log',
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
# Log to both file and console
import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# Console handler
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
# File handler
file_handler = logging.FileHandler('app.log')
file_handler.setLevel(logging.DEBUG)
# Add handlers
logger.addHandler(console_handler)
logger.addHandler(file_handler)# Named logger
logger = logging.getLogger('myapp.module')
logger.info('Module initialized')
# Log exceptions with traceback
try:
result = 1 / 0
except Exception:
logger.exception('An error occurred')
# Automatically includes traceback
# Using extra data
logger.info('User logged in', extra={'user': 'alice', 'ip': '192.168.1.1'})logger = logging.getLogger(__name__) per modulelogger.exception() includes traceback2024-01-15 10:30:00 - INFO - Application started
2024-01-15 10:30:01 - WARNING - Low memory
2024-01-15 10:30:02 - ERROR - Connection failed
import logginglogging.basicConfig(level=logging.DEBUG)debug, info, warning, error, criticallogger = logging.getLogger('name')logger.exception('msg')Review feedback below
argparse module.import argparse
# Create parser
parser = argparse.ArgumentParser(
description='Process some files.'
)
# Add positional argument
parser.add_argument('filename', help='The file to process')
# Parse arguments
args = parser.parse_args()
print(f'Processing: {args.filename}')# Optional argument with default
parser.add_argument(
'-o', '--output',
default='output.txt',
help='Output file (default: output.txt)'
)
# Boolean flag
parser.add_argument(
'-v', '--verbose',
action='store_true',
help='Enable verbose output'
)
# Count flag (-vvv for verbosity)
parser.add_argument(
'-d', '--debug',
action='count',
default=0,
help='Debug level'
)
args = parser.parse_args()
if args.verbose:
print('Verbose mode enabled')# Typed argument
parser.add_argument(
'-n', '--number',
type=int,
required=True,
help='Number of items'
)
# Choices
parser.add_argument(
'--format',
choices=['json', 'csv', 'xml'],
default='json',
help='Output format'
)
# Multiple values
parser.add_argument(
'--files',
nargs='+',
help='List of files'
)
# Optional number of values
parser.add_argument(
'--tags',
nargs='*',
help='Optional tags'
)# Create subparsers
subparsers = parser.add_subparsers(dest='command')
# 'add' subcommand
add_parser = subparsers.add_parser('add', help='Add item')
add_parser.add_argument('name', help='Item name')
# 'remove' subcommand
remove_parser = subparsers.add_parser('remove', help='Remove item')
remove_parser.add_argument('id', type=int, help='Item ID')
args = parser.parse_args()
if args.command == 'add':
print(f'Adding: {args.name}')
elif args.command == 'remove':
print(f'Removing ID: {args.id}')-h or --help for auto-generated helprequired=True for mandatory optional argsnargs='+' for one or more, '*' for zero or more$ python cli.py input.txt -o result.json -v
Processing: input.txt
Output: result.json
Verbose: True
import argparseparser = argparse.ArgumentParser(description='...')parser.add_argument('name')parser.add_argument('-o', '--option')args = parser.parse_args()Review feedback below
You've completed all 30 Python labs! You now have comprehensive mastery of Python programming.
From basics to advanced topics - variables, OOP, decorators, async, standard library modules, HTTP, logging, and CLI tools.
You're ready for professional development, data science, automation, web development, and more!