# python/01-fastapi-setup.py"""Modern FastAPI web service setup and configuration"""fromfastapiimportFastAPI,HTTPException,Depends,statusfromfastapi.middleware.corsimportCORSMiddlewarefromfastapi.middleware.trustedhostimportTrustedHostMiddlewarefromfastapi.securityimportHTTPBearer,HTTPAuthorizationCredentialsfrompydanticimportBaseModel,FieldfromtypingimportList,Optional,Dict,Anyimportuvicornimportloggingfromcontextlibimportasynccontextmanager# Configure logginglogging.basicConfig(level=logging.INFO)logger=logging.getLogger(__name__)classWebServiceConfig:"""Web service configuration"""def__init__(self):self.title="Modern Python Web Service"self.description="A production-ready FastAPI web service"self.version="1.0.0"self.debug=Falseself.host="0.0.0.0"self.port=8000# Pydantic modelsclassUserCreate(BaseModel):"""User creation model"""name:str=Field(...,min_length=1,max_length=100)email:str=Field(...,regex=r'^[\w\.-]+@[\w\.-]+\.\w+$')age:Optional[int]=Field(None,ge=0,le=120)classUserResponse(BaseModel):"""User response model"""id:intname:stremail:strage:Optional[int]created_at:strclassUserUpdate(BaseModel):"""User update model"""name:Optional[str]=Field(None,min_length=1,max_length=100)email:Optional[str]=Field(None,regex=r'^[\w\.-]+@[\w\.-]+\.\w+$')age:Optional[int]=Field(None,ge=0,le=120)classErrorResponse(BaseModel):"""Error response model"""error:strdetail:Optional[str]=Nonestatus_code:int# Database simulationclassDatabase:"""Simple in-memory database simulation"""def__init__(self):self.users={}self.next_id=1asyncdefcreate_user(self,user_data:UserCreate)->UserResponse:"""Create a new user"""user_id=self.next_idself.next_id+=1user=UserResponse(id=user_id,name=user_data.name,email=user_data.email,age=user_data.age,created_at="2024-01-01T00:00:00Z")self.users[user_id]=userreturnuserasyncdefget_user(self,user_id:int)->Optional[UserResponse]:"""Get user by ID"""returnself.users.get(user_id)asyncdefget_users(self,skip:int=0,limit:int=100)->List[UserResponse]:"""Get all users with pagination"""users=list(self.users.values())returnusers[skip:skip+limit]asyncdefupdate_user(self,user_id:int,user_data:UserUpdate)->Optional[UserResponse]:"""Update user"""ifuser_idnotinself.users:returnNoneuser=self.users[user_id]update_data=user_data.dict(exclude_unset=True)forfield,valueinupdate_data.items():setattr(user,field,value)returnuserasyncdefdelete_user(self,user_id:int)->bool:"""Delete user"""ifuser_idinself.users:delself.users[user_id]returnTruereturnFalse# Global database instancedb=Database()# Securitysecurity=HTTPBearer()asyncdefget_current_user(credentials:HTTPAuthorizationCredentials=Depends(security)):"""Get current user from JWT token"""# In a real application, you would validate the JWT token hereifcredentials.credentials!="valid_token":raiseHTTPException(status_code=status.HTTP_401_UNAUTHORIZED,detail="Invalid authentication credentials")return{"user_id":1,"username":"admin"}# Application lifespan@asynccontextmanagerasyncdeflifespan(app:FastAPI):"""Application lifespan manager"""# Startuplogger.info("Starting web service...")yield# Shutdownlogger.info("Shutting down web service...")# Create FastAPI applicationdefcreate_app()->FastAPI:"""Create and configure FastAPI application"""config=WebServiceConfig()app=FastAPI(title=config.title,description=config.description,version=config.version,debug=config.debug,lifespan=lifespan)# Add middlewareapp.add_middleware(CORSMiddleware,allow_origins=["*"],# Configure appropriately for productionallow_credentials=True,allow_methods=["*"],allow_headers=["*"],)app.add_middleware(TrustedHostMiddleware,allowed_hosts=["*"]# Configure appropriately for production)# Add routessetup_routes(app)returnappdefsetup_routes(app:FastAPI):"""Setup application routes"""@app.get("/",response_model=Dict[str,str])asyncdefroot():"""Root endpoint"""return{"message":"Welcome to the Python Web Service API"}@app.get("/health",response_model=Dict[str,str])asyncdefhealth_check():"""Health check endpoint"""return{"status":"healthy","timestamp":"2024-01-01T00:00:00Z"}@app.post("/users",response_model=UserResponse,status_code=status.HTTP_201_CREATED)asyncdefcreate_user(user:UserCreate,current_user:dict=Depends(get_current_user)):"""Create a new user"""try:new_user=awaitdb.create_user(user)logger.info(f"Created user: {new_user.id}")returnnew_userexceptExceptionase:logger.error(f"Error creating user: {e}")raiseHTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,detail="Failed to create user")@app.get("/users",response_model=List[UserResponse])asyncdefget_users(skip:int=0,limit:int=100,current_user:dict=Depends(get_current_user)):"""Get all users with pagination"""try:users=awaitdb.get_users(skip=skip,limit=limit)returnusersexceptExceptionase:logger.error(f"Error getting users: {e}")raiseHTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,detail="Failed to get users")@app.get("/users/{user_id}",response_model=UserResponse)asyncdefget_user(user_id:int,current_user:dict=Depends(get_current_user)):"""Get user by ID"""try:user=awaitdb.get_user(user_id)ifnotuser:raiseHTTPException(status_code=status.HTTP_404_NOT_FOUND,detail="User not found")returnuserexceptHTTPException:raiseexceptExceptionase:logger.error(f"Error getting user {user_id}: {e}")raiseHTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,detail="Failed to get user")@app.put("/users/{user_id}",response_model=UserResponse)asyncdefupdate_user(user_id:int,user_data:UserUpdate,current_user:dict=Depends(get_current_user)):"""Update user"""try:updated_user=awaitdb.update_user(user_id,user_data)ifnotupdated_user:raiseHTTPException(status_code=status.HTTP_404_NOT_FOUND,detail="User not found")returnupdated_userexceptHTTPException:raiseexceptExceptionase:logger.error(f"Error updating user {user_id}: {e}")raiseHTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,detail="Failed to update user")@app.delete("/users/{user_id}",status_code=status.HTTP_204_NO_CONTENT)asyncdefdelete_user(user_id:int,current_user:dict=Depends(get_current_user)):"""Delete user"""try:success=awaitdb.delete_user(user_id)ifnotsuccess:raiseHTTPException(status_code=status.HTTP_404_NOT_FOUND,detail="User not found")exceptHTTPException:raiseexceptExceptionase:logger.error(f"Error deleting user {user_id}: {e}")raiseHTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,detail="Failed to delete user")# Create application instanceapp=create_app()# Run applicationif__name__=="__main__":config=WebServiceConfig()uvicorn.run("main:app",host=config.host,port=config.port,reload=config.debug,log_level="info")
# python/02-advanced-fastapi.py"""Advanced FastAPI patterns and middleware"""fromfastapiimportFastAPI,Request,Response,Dependsfromfastapi.middleware.baseimportBaseHTTPMiddlewarefromfastapi.responsesimportJSONResponsefromfastapi.exceptionsimportRequestValidationErrorfromstarlette.exceptionsimportHTTPExceptionasStarletteHTTPExceptionimporttimeimportuuidfromtypingimportCallable,Dict,Anyimportlogginglogger=logging.getLogger(__name__)classRequestLoggingMiddleware(BaseHTTPMiddleware):"""Request logging middleware"""asyncdefdispatch(self,request:Request,call_next:Callable)->Response:# Generate request IDrequest_id=str(uuid.uuid4())request.state.request_id=request_id# Log requeststart_time=time.time()logger.info(f"Request {request_id}: {request.method}{request.url}")# Process requestresponse=awaitcall_next(request)# Log responseprocess_time=time.time()-start_timelogger.info(f"Response {request_id}: {response.status_code} in {process_time:.3f}s")# Add request ID to response headersresponse.headers["X-Request-ID"]=request_idreturnresponseclassRateLimitingMiddleware(BaseHTTPMiddleware):"""Rate limiting middleware"""def__init__(self,app,calls:int=100,period:int=60):super().__init__(app)self.calls=callsself.period=periodself.clients={}asyncdefdispatch(self,request:Request,call_next:Callable)->Response:client_ip=request.client.hostcurrent_time=time.time()# Clean old entriesself.clients={ip:timesforip,timesinself.clients.items()ifany(t>current_time-self.periodfortintimes)}# Check rate limitifclient_ipinself.clients:self.clients[client_ip]=[tfortinself.clients[client_ip]ift>current_time-self.period]iflen(self.clients[client_ip])>=self.calls:returnJSONResponse(status_code=429,content={"error":"Rate limit exceeded"})# Add current requestifclient_ipnotinself.clients:self.clients[client_ip]=[]self.clients[client_ip].append(current_time)returnawaitcall_next(request)classErrorHandlingMiddleware(BaseHTTPMiddleware):"""Error handling middleware"""asyncdefdispatch(self,request:Request,call_next:Callable)->Response:try:returnawaitcall_next(request)exceptExceptionase:logger.error(f"Unhandled exception: {e}")returnJSONResponse(status_code=500,content={"error":"Internal server error"})defcreate_advanced_app()->FastAPI:"""Create FastAPI app with advanced middleware"""app=FastAPI(title="Advanced Python Web Service",description="Production-ready FastAPI with advanced patterns",version="1.0.0")# Add middlewareapp.add_middleware(RequestLoggingMiddleware)app.add_middleware(RateLimitingMiddleware,calls=100,period=60)app.add_middleware(ErrorHandlingMiddleware)# Add exception handlers@app.exception_handler(StarletteHTTPException)asyncdefhttp_exception_handler(request:Request,exc:StarletteHTTPException):returnJSONResponse(status_code=exc.status_code,content={"error":exc.detail})@app.exception_handler(RequestValidationError)asyncdefvalidation_exception_handler(request:Request,exc:RequestValidationError):returnJSONResponse(status_code=422,content={"error":"Validation error","details":exc.errors()})returnapp# Dependency injection patternsclassDatabaseService:"""Database service for dependency injection"""def__init__(self):self.connection_string="sqlite:///app.db"asyncdefget_connection(self):"""Get database connection"""# In a real app, you would return an actual database connectionreturn{"connection":"active"}asyncdefget_database_service()->DatabaseService:"""Get database service dependency"""returnDatabaseService()asyncdefget_current_user_id(request:Request)->int:"""Get current user ID from request"""# In a real app, you would extract this from JWT or sessionreturn1# Advanced route patternsdefsetup_advanced_routes(app:FastAPI):"""Setup advanced route patterns"""@app.get("/protected")asyncdefprotected_route(user_id:int=Depends(get_current_user_id),db_service:DatabaseService=Depends(get_database_service)):"""Protected route with dependencies"""connection=awaitdb_service.get_connection()return{"message":"This is a protected route","user_id":user_id,"database":connection}@app.get("/async-data")asyncdefasync_data_route():"""Async data processing route"""importasyncioasyncdeffetch_data(delay:float)->str:awaitasyncio.sleep(delay)returnf"Data fetched after {delay}s"# Fetch data concurrentlyresults=awaitasyncio.gather(fetch_data(0.1),fetch_data(0.2),fetch_data(0.3))return{"results":results}
# python/03-flask-setup.py"""Modern Flask web service setup and configuration"""fromflaskimportFlask,request,jsonify,gfromflask_corsimportCORSfromflask_limiterimportLimiterfromflask_limiter.utilimportget_remote_addressfromwerkzeug.exceptionsimportHTTPExceptionimportloggingfromfunctoolsimportwrapsimporttime# Configure logginglogging.basicConfig(level=logging.INFO)logger=logging.getLogger(__name__)classFlaskWebService:"""Modern Flask web service"""def__init__(self):self.app=Flask(__name__)self.app.config['SECRET_KEY']='your-secret-key'self.app.config['JSON_SORT_KEYS']=False# Setup extensionsself.setup_extensions()# Setup middlewareself.setup_middleware()# Setup routesself.setup_routes()# Setup error handlersself.setup_error_handlers()defsetup_extensions(self):"""Setup Flask extensions"""# CORSCORS(self.app,origins=["*"])# Rate limitingself.limiter=Limiter(self.app,key_func=get_remote_address,default_limits=["200 per day","50 per hour"])defsetup_middleware(self):"""Setup middleware"""@self.app.before_requestdefbefore_request():g.start_time=time.time()g.request_id=str(uuid.uuid4())logger.info(f"Request {g.request_id}: {request.method}{request.url}")@self.app.after_requestdefafter_request(response):ifhasattr(g,'start_time'):process_time=time.time()-g.start_timeresponse.headers['X-Process-Time']=str(process_time)response.headers['X-Request-ID']=g.request_idlogger.info(f"Response {g.request_id}: {response.status_code} in {process_time:.3f}s")returnresponsedefsetup_routes(self):"""Setup application routes"""@self.app.route('/',methods=['GET'])defroot():"""Root endpoint"""returnjsonify({"message":"Welcome to Flask Web Service"})@self.app.route('/health',methods=['GET'])defhealth_check():"""Health check endpoint"""returnjsonify({"status":"healthy"})@self.app.route('/users',methods=['GET'])@self.limiter.limit("10 per minute")defget_users():"""Get all users"""try:# Simulate database queryusers=[{"id":1,"name":"Alice","email":"alice@example.com"},{"id":2,"name":"Bob","email":"bob@example.com"}]returnjsonify({"users":users})exceptExceptionase:logger.error(f"Error getting users: {e}")returnjsonify({"error":"Internal server error"}),500@self.app.route('/users/<int:user_id>',methods=['GET'])defget_user(user_id):"""Get user by ID"""try:# Simulate database queryifuser_id==1:user={"id":1,"name":"Alice","email":"alice@example.com"}returnjsonify(user)else:returnjsonify({"error":"User not found"}),404exceptExceptionase:logger.error(f"Error getting user {user_id}: {e}")returnjsonify({"error":"Internal server error"}),500@self.app.route('/users',methods=['POST'])@self.limiter.limit("5 per minute")defcreate_user():"""Create new user"""try:data=request.get_json()ifnotdata:returnjsonify({"error":"No JSON data provided"}),400# Validate required fieldsrequired_fields=['name','email']forfieldinrequired_fields:iffieldnotindata:returnjsonify({"error":f"Missing required field: {field}"}),400# Simulate user creationuser={"id":3,"name":data['name'],"email":data['email']}returnjsonify(user),201exceptExceptionase:logger.error(f"Error creating user: {e}")returnjsonify({"error":"Internal server error"}),500defsetup_error_handlers(self):"""Setup error handlers"""@self.app.errorhandler(HTTPException)defhandle_http_exception(e):"""Handle HTTP exceptions"""returnjsonify({"error":e.description}),e.code@self.app.errorhandler(404)defhandle_not_found(e):"""Handle 404 errors"""returnjsonify({"error":"Not found"}),404@self.app.errorhandler(500)defhandle_internal_error(e):"""Handle 500 errors"""returnjsonify({"error":"Internal server error"}),500# Create Flask applicationflask_app=FlaskWebService().appif__name__=="__main__":flask_app.run(host='0.0.0.0',port=5000,debug=True)
# python/04-django-setup.py"""Modern Django web service setup and configuration"""fromdjango.httpimportJsonResponsefromdjango.views.decorators.csrfimportcsrf_exemptfromdjango.views.decorators.httpimportrequire_http_methodsfromdjango.utils.decoratorsimportmethod_decoratorfromdjango.viewsimportViewfromdjango.confimportsettingsfromdjango.core.exceptionsimportValidationErrorimportjsonimportlogginglogger=logging.getLogger(__name__)classDjangoWebService:"""Modern Django web service"""def__init__(self):self.setup_settings()self.setup_middleware()self.setup_urls()defsetup_settings(self):"""Setup Django settings"""settings.configure(DEBUG=True,SECRET_KEY='your-secret-key',ROOT_URLCONF=__name__,MIDDLEWARE=['django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware',],ALLOWED_HOSTS=['*'],)defsetup_middleware(self):"""Setup custom middleware"""passdefsetup_urls(self):"""Setup URL patterns"""fromdjango.urlsimportpath,includeurlpatterns=[path('',self.root_view),path('health/',self.health_view),path('users/',self.users_view),path('users/<int:user_id>/',self.user_detail_view),]returnurlpatternsdefroot_view(self,request):"""Root view"""returnJsonResponse({"message":"Welcome to Django Web Service"})defhealth_view(self,request):"""Health check view"""returnJsonResponse({"status":"healthy"})@csrf_exempt@require_http_methods(["GET","POST"])defusers_view(self,request):"""Users view"""ifrequest.method=='GET':returnself.get_users(request)elifrequest.method=='POST':returnself.create_user(request)defget_users(self,request):"""Get all users"""try:# Simulate database queryusers=[{"id":1,"name":"Alice","email":"alice@example.com"},{"id":2,"name":"Bob","email":"bob@example.com"}]returnJsonResponse({"users":users})exceptExceptionase:logger.error(f"Error getting users: {e}")returnJsonResponse({"error":"Internal server error"},status=500)defcreate_user(self,request):"""Create new user"""try:data=json.loads(request.body)# Validate required fieldsrequired_fields=['name','email']forfieldinrequired_fields:iffieldnotindata:returnJsonResponse({"error":f"Missing required field: {field}"},status=400)# Simulate user creationuser={"id":3,"name":data['name'],"email":data['email']}returnJsonResponse(user,status=201)exceptjson.JSONDecodeError:returnJsonResponse({"error":"Invalid JSON"},status=400)exceptExceptionase:logger.error(f"Error creating user: {e}")returnJsonResponse({"error":"Internal server error"},status=500)@require_http_methods(["GET"])defuser_detail_view(self,request,user_id):"""User detail view"""try:# Simulate database queryifuser_id==1:user={"id":1,"name":"Alice","email":"alice@example.com"}returnJsonResponse(user)else:returnJsonResponse({"error":"User not found"},status=404)exceptExceptionase:logger.error(f"Error getting user {user_id}: {e}")returnJsonResponse({"error":"Internal server error"},status=500)# Create Django applicationdjango_app=DjangoWebService()if__name__=="__main__":fromdjango.core.managementimportexecute_from_command_lineexecute_from_command_line()
# 1. FastAPI Web Servicefrompython.fastapi_setupimportcreate_appapp=create_app()# Run with uvicornimportuvicornuvicorn.run(app,host="0.0.0.0",port=8000)# 2. Flask Web Servicefrompython.flask_setupimportFlaskWebServiceflask_app=FlaskWebService().appflask_app.run(host='0.0.0.0',port=5000)# 3. Django Web Servicefrompython.django_setupimportDjangoWebServicedjango_app=DjangoWebService()
# Complete web service setupdefcreate_production_web_service(framework:str="fastapi"):"""Create production-ready web service"""ifframework=="fastapi":frompython.fastapi_setupimportcreate_advanced_appapp=create_advanced_app()elifframework=="flask":frompython.flask_setupimportFlaskWebServiceapp=FlaskWebService().appelifframework=="django":frompython.django_setupimportDjangoWebServiceapp=DjangoWebService()returnapp