ONLINE BOOKSTORE MANAGEMENT SYSTEM
Project submitted to the
APSSDC
Bachelor of Technology
In
Computer Science and Engineering
Submitted By
[Link] Manasa(N200904)
[Link] Muskhan(N200801)
Siddardha Pedada(N200389)
Menavath Sathish Naik(229x1a05b7)
[Link](23102A050019)
Under the guidance of
Tamada Srikanya
Revathidevi Yelamanchili
1
TABLE OF CONTENTS
[Link] CONTENTS PAGE NO
1 Abstract 3
2 Introduction 4
3 System Requirements 5
4 Architecture 6
5 Advantages 7
6 Project Code 8-29
7 Conclusion 30
8 References 31
2
ABSTRACT
The Bookstore Management System is a full-stack web application designed to streamline
and enhance the experience of purchasing, managing, and requesting books online. Built using
Django for the backend and Bootstrap for the frontend, the system ensures dynamic data
handling, responsive interfaces, and secure user interaction.
The platform features two primary user roles—Admin and Customer. Admins can manage the
inventory by adding, viewing, or deleting book records, and monitor customer activity and
book requests through a centralized dashboard. Customers can browse available books, add
them to a cart, and place orders with various payment modes. They can also request
unavailable books through a dedicated request form.
The system ensures secure user authentication with role-based access, allowing different
privileges for admins and customers. It features a real-time shopping cart with checkout and
price calculation, along with a dedicated module for users to request unavailable books. This
project showcases how to create and process web forms securely using Django’s built-in tools.
It applies CRUD operations—Create, Read, Update, Delete—for managing books and user
records efficiently. Template inheritance ensures modular and reusable HTML structures for a
clean UI.
3
INTRODUCTION
The Bookstore Management System is a web-based platform developed to streamline the
operations of a modern bookstore, offering both administrators and customers a seamless and
efficient experience. Built using Django as the backend framework and Bootstrap for
responsive frontend design, this project aims to automate and simplify essential bookstore
functions such as book inventory management, customer handling and book requests.
The system provides role-based access—administrators can manage books, view customers,
monitor orders, and handle book requests, while users can browse books, manage a cart,
request unavailable titles, and securely checkout using multiple payment methods. The
interface emphasizes user-friendliness, clarity, and responsiveness, making it adaptable across
devices.
This project not only demonstrates core full-stack development skills, such as template
rendering, form handling, database integration, and session management, but also showcases
thoughtful implementation of features such as alerts, validation.
Ultimately, the Bookstore Management System addresses the real-world need for a scalable,
maintainable, and intuitive solution to manage bookstore operations in the digital age.
4
SYSTEM REQUIREMENTS
Operating System
• Windows 10/11 (64-bit)
• macOS 10.15 or later
• Linux (Ubuntu 18.04+ recommended)
Hardware Requirements
• Processor: Intel i5 / AMD Ryzen 5 or higher
• RAM: Minimum 4 GB (8 GB recommended)
• Storage: Minimum 500 MB free disk space
• Display: 1024×768 resolution or higher
Software Requirements
1. Frontend
• Languages & Tools: HTML5, CSS3, Bootstrap 5
• Template Engine: Django Template Language (DTL)
• JavaScript: For dynamic interactions, form validation
2. Backend
• Framework: Django (Python-based web framework)
• Python Version: 3.8 or higher
• Django Version: 3.2 or higher (LTS preferred)
3. Database
• Primary Database: SQLite (default for Django, suitable for development)
4. Browser Compatibility
• Chrome, Firefox, Microsoft Edge — modern versions recommended
5
ARCHITECTURE
6
ADVANTAGES
• Centralized Book Inventory Management:
Admins can efficiently view, add, and remove books, including key details like name,
author, category, price, and stock—ensuring accurate inventory records.
• Streamlined Ordering & Checkout:
Users can browse books, add them to a cart, and place orders through a responsive
and structured billing form. Built-in order summary with pricing offers a seamless
experience.
• User Book Requests:
The system includes a request feature where users can submit books they wish to see
in the store—improving user engagement and feedback collection.
• Role-Based Interface:
Separate views for admins and regular users improve clarity and reduce clutter.
Admins can manage books and customers, while users interact with the catalog and
make purchases.
• Secure Form Handling with CSRF Protection:
Django’s built-in {% csrf_token %} in forms safeguards against malicious attacks
during data submission.
• Administrative Insights:
Admins can track customers, view requested books, and monitor orders, enabling
better decision-making and customer support.
7
PROJECT CODE
[Link] :
from [Link] import path
from . import views
urlpatterns = [
path("", [Link], name="index"),
path("signup/", [Link], name="Usersignup"),
path("user_login/", views.User_login, name="User_login"),
path("logout/", [Link], name="Logout"),
path('', [Link], name='home'),
# For admin
path("all_books/", [Link], name="Admin"),
path("customers_list/", views.customers_list, name="customers_list"),
path("add_books/", views.Add_Books, name="add_new_books"),
path("all_books/delete_<int:myid>/", views.Delete_Books, name="delete_book"),
path('all_books/delete_<int:myid>/', views.Delete_Books, name='deletebook'),
path("see_requested_books/", views.see_requested_books,
name="see_requested_books"),
path("delete_requested_books/delete_<int:myid>/", views.delete_requested_books,
name="delete_requested_books"),
path("customers_list/orders_<int:myid>/", views.orders_list, name="orders_list"),
path("customers_list/orders_<int:myid>/data/", views.data_view, name="data"),
# For customers
path("for_users/", [Link], name="Users"),
8
path("request_books/", views.request_books, name="request_books"),
path("checkout/", [Link], name="checkout"),
[Link]:
from [Link] import render, redirect, HttpResponse,get_object_or_404
from .models import Book
from [Link] import messages
from [Link] import User
from [Link] import authenticate, login, logout
from .decorators import restricted_login, admin_or_user
from .forms import BookForm, RequestBookForm
from .models import *
from [Link] import login_required
from [Link] import JsonResponse
from .models import Book # Make sure Book is imported
def home(request):
return render(request, '[Link]')
def index(request):
return render(request, '[Link]')
def Usersignup(request):
if [Link].is_authenticated:
return redirect('/')
else:
if [Link]=="POST":
9
username = [Link]['username']
email = [Link]['email']
first_name=[Link]['first_name']
last_name=[Link]['last_name']
password1 = [Link]['password1']
password2 = [Link]['password2']
if len(username) > 15:
[Link](request, "Username must be under 15 characters.")
return redirect('/signup')
[Link](request, "Username must contain only letters and numbers.")
return redirect('/signup')
if password1 != password2:
[Link](request, "Passwords do not match.")
return redirect('/signup')
user = [Link].create_user(username, email, password1)
user.first_name = first_name
user.last_name = last_name
[Link]()
return render(request, 'user_login.html')
return render(request, "[Link]")
def User_login(request):
if [Link].is_authenticated:
return redirect('/')
else:
10
if [Link]=="POST":
user_username = [Link]['user_username']
user_password = [Link]['user_password']
user = authenticate(username=user_username, password=user_password)
if user is not None:
login(request, user)
[Link](request, "Successfully Logged In")
return redirect("/for_users")
else:
[Link](request, "Please provide a valid username and password")
return render(request, "user_login.html")
def Logout(request):
logout(request)
thank = True
return render(request, "[Link]", {'thank':thank})
@admin_or_user
def Admin(request):
books = [Link]()
total_books = [Link]()
return render (request, "for_admin.html", {'books':books, 'total_books':total_books})
def Delete_Books(request, myid):
book = get_object_or_404(Book, id=myid)
if [Link] == "POST":
[Link]()
11
return redirect('/all_books/')
return render(request, 'delete_book.html', {'delete_book': book})
@login_required(login_url = '/user_login')
def Users(request):
books = [Link]()
total_books = [Link]()
return render (request, "for_user.html", {'books':books, 'total_books':total_books})
def Add_Books(request):
if [Link]=="POST":
form = BookForm([Link])
if form.is_valid():
[Link]()
return render(request, "add_books.html")
else:
form=BookForm()
return render(request, "add_books.html", {'form':form})
def request_books(request):
if [Link]=="POST":
user = [Link]
book_name = [Link]['book_name']
author = [Link]['author']
book = Request_Book(user=user, book_name=book_name, author=author)
[Link]()
thank = True
12
return render(request, "request_books.html", {'thank':thank})
return render(request, "request_books.html")
def see_requested_books(request):
requested_book = Request_Book.[Link]()
requested_books_count = requested_book.count()
return render(request, "see_requested_books.html",
{'requested_book':requested_book, 'requested_books_count':requested_books_count})
def delete_requested_books(request, myid):
delete_book = Request_Book.[Link](id=myid)
if [Link] == "POST":
delete_book.delete()
return redirect('/see_requested_books')
return render(request, "delete_requested_books.html", {'delete_book':delete_book})
def customers_list(request):
customers = [Link]()
customer_count = [Link]()
return render(request, "customers_list.html", {'customers':customers,
'customer_count':customer_count})
def orders_list(request, myid):
customer = [Link](id=myid)
return render(request, "orders_list.html", {'customer':customer})
def data_view(request, myid):
orders = [Link](id=myid)
return JsonResponse({'data':orders.items_json})
13
def checkout(request):
if [Link]=="POST":
user = [Link]
items_json = [Link]('itemsJson', '')
name = [Link]('name', '')
price = [Link]('price', '')
email = [Link]('email', '')
address = [Link]('address', '')
phone = [Link]('phone', '')
order = Order(user=user, items_json=items_json, name=name, email=email,
address=address, phone=phone, price=price)
[Link]()
thank = True
return render(request, '[Link]', {'thank':thank})
return render(request, "[Link]")
Models:
from [Link] import render, redirect, get_object_or_404
from [Link] import models
from [Link] import User
class Customer([Link]):
name = [Link](max_length=100)
email = [Link](max_length=100)
phone = [Link](max_length=100)
14
date = [Link](auto_now_add=True)
def __str__ (self):
return [Link]
class Book([Link]):
CATEGORY = (
('Mystery', 'Mystery'),
('Thriller', 'Thriller'),
('Sci-Fi', 'Sci-Fi'),
('Humor', 'Humor'),
('Horror', 'Horror'),
book_name = [Link](max_length=100)
author = [Link](max_length=100, default="")
category = [Link](max_length=100, choices=CATEGORY)
price = [Link]()
stock = [Link](default=2)
def __str__ (self):
return self.book_name
class Order([Link]):
user = [Link](User, on_delete=[Link], default=1)
items_json = [Link](max_length=5000, blank=True)
price = [Link](default=0)
name = [Link](max_length=100, blank=True)
15
email = [Link](max_length=100, blank=True)
address = [Link](max_length=100, default="")
phone = [Link](max_length=100, blank=True)
date = [Link](auto_now_add=True)
def __str__ (self):
return str([Link])
class Request_Book([Link]):
book_name = [Link](max_length=100)
author = [Link](max_length=100)
user = [Link](User, on_delete=[Link], default=1)
def __str__ (self):
return self.book_name
User navbar:
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Bootstrap CSS -->
<link href="[Link]
rel="stylesheet" integrity="sha384-
EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASj
C" crossorigin="anonymous">
<title>{% block title %} {% endblock %}</title>
16
{% block css %}
{% endblock %}
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<div class="container-fluid">
<a class="navbar-brand" href="/">Project Bookstore</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-
target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-
expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link active" aria-current="page" href="/">Home</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown"
role="button" data-bs-toggle="dropdown" aria-expanded="false">
Users
</a>
<ul class="dropdown-menu" aria-labelledby="navbarDropdown">
<li><a class="dropdown-item" href="/for_users/">Buy Books</a></li>
<li><a class="dropdown-item" href="/request_books/">Request a
Book</a></li>
17
</ul>
</li>
{% block cart-item %} {% endblock %}
</ul>
{% if user.is_authenticated %}
<a class="nav-link" href="#">Welcome {{[Link]}}</a>
<a href="/logout/" class="btn btn-outline-dark mx-4"
type="submit">Logout</a>
{% endif %}
{% if user.is_superuser %}
<a href="/all_books/" class="btn btn-outline-dark" type="submit">Admin</a>
{% endif %}
</div>
</div>
</nav>
{% block body %}
<script
src="[Link]
integrity="sha384-
MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxV
XM" crossorigin="anonymous"></script>
{% endblock %}
{% block js %} {% endblock %}
</body>
</html>
18
Admin navbar:
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Bootstrap CSS -->
<link href="[Link]
rel="stylesheet" integrity="sha384-
EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASj
C" crossorigin="anonymous">
<title>{% block title %} {% endblock %}</title>
<style>
{% block css %} {% endblock %}
</style>
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<div class="container-fluid">
<a class="navbar-brand" href="/">Project Bookstore</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-
target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-
expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
19
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link active" aria-current="page" href="/">Home</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown"
role="button" data-bs-toggle="dropdown" aria-expanded="false">
Admin Panel
</a>
<ul class="dropdown-menu" aria-labelledby="navbarDropdown">
<li><a class="dropdown-item" href="/add_books/">Add New
Books</a></li>
<li><a class="dropdown-item" href="/all_books/">All Books</a></li>
<li><a class="dropdown-item" href="/customers_list/">Customers
List</a></li>
<li><a class="dropdown-item" href="/see_requested_books/">See Books
Request</a></li>
</ul>
</li>
</ul>
{% if user.is_authenticated %}
<a class="nav-link" href="#">Welcome {{[Link]}}</a>
<a href="/logout/" class="btn btn-outline-dark mx-4"
type="submit">Logout</a>
20
{% endif %}
</div>
</div>
</nav>
{% block body %}
{% endblock %}
<script
src="[Link]
integrity="sha384-
MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxV
XM" crossorigin="anonymous"></script>
<script src="[Link]
integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4="
crossorigin="anonymous"></script>
{% block js %}
{% endblock %}
</body>
</html>
Base:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="[Link]
rel="stylesheet" integrity="sha384-
21
EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASj
C" crossorigin="anonymous">
<title> {% block title %} {% endblock %} </title>
<style>
{% block css %} {% endblock %}
</style>
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<div class="container-fluid">
<a class="navbar-brand" href="/">Project Bookstore</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-
target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-
expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link active" aria-current="page" href="/">Home</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/for_users/">Users</a>
</li>
</ul>
22
{% if user.is_authenticated %}
<form class="d-flex" >
<a class="nav-link" href="#">Welcome {{[Link]}}</a>
<a href="/logout/" class="btn btn-outline-success mx-4"
type="submit">Logout</a>
{% else %}
<form class="d-flex" >
<a href="/signup/" class="btn btn-outline-dark" type="submit">Sign Up</a>
<a href="/user_login/" class="btn btn-outline-dark mx-4"
type="submit">Login</a>
</form>
{% endif %}
</div>
</div>
</nav>
<script src="[Link]
integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4="
crossorigin="anonymous"></script>
<script src="[Link]
integrity="sha384-
ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q"
crossorigin="anonymous"></script>
<script src="[Link]
integrity="sha384-
JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl"
crossorigin="anonymous"></script>
23
<script
src="[Link]
integrity="sha384-
MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxV
XM" crossorigin="anonymous"></script>
{% block body %}
{% endblock %}
</body>
{% block js %}
{% endblock %}
</html>
Index:
{% extends '[Link]' %}
{% block title %} Bookstore {% endblock %}
{% block css %}
{% endblock %}
{% block body %}
{% load static %}
{% for message in messages %}
<div class="alert alert-{{ [Link] }} alert-dismissible fade show" role="alert">
<strong>Message : </strong> {{ message }}
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div> {% endfor %}
<div id="carouselExampleIndicators" class="carousel slide" data-ride="carousel">
24
<ol class="carousel-indicators">
<li data-target="#carouselExampleIndicators" data-slide-to="0"
class="active"></li>
<li data-target="#carouselExampleIndicators" data-slide-to="1"></li>
<li data-target="#carouselExampleIndicators" data-slide-to="2"></li>
</ol>
<div class="carousel-inner">
<div class="carousel-item active">
<img class="d-block w-100 " height="500px" src="{% static '[Link]' %}"
alt="First slide">
</div>
<div class="carousel-item">
<img class="d-block w-100 " height="500px" src="{% static '[Link]' %}"
alt="Second slide">
</div>
<div class="carousel-item">
<img class="d-block w-100 " height="500px" src="{% static '[Link]' %}"
alt="Third slide">
</div>
</div>
<a class="carousel-control-prev" href="#carouselExampleIndicators" role="button"
data-slide="prev">
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
<span class="sr-only">Previous</span>
</a>
<a class="carousel-control-next" href="#carouselExampleIndicators" role="button"
data-slide="next">
25
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="sr-only">Next</span>
</a>
</div>
{% endblock %}
{% block js %}
<script>
{% if thank %}
alert('Logout Successful.');
[Link]();
[Link] = '/';
{% endif %}
</script>
{% endblock %}
Request book:
{% extends 'user_navbar.html' %}
{% load static %}
{% block title %}Request Books{% endblock %}
{% block css %}
<link rel="stylesheet" href="{% static 'css/[Link]' %}">
<style>
body {
background-image: url("{% static 'images/[Link]' %}");
26
background-repeat: no-repeat; background-size: cover;
</style>
{% endblock %}
{% block body %}
<div class="alert alert-warning alert-dismissible fade show mt-4" role="alert">
<h2>Welcome</h2>
<h3>Kindly submit your request for the required book using the form below....</h3>
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-
label="Close"></button>
</div>
<div class="container card card-body mt-5 col-md-4">
<h1 class="text-center bg-warning text-secondary">Request for Book</h1><br>
<form method="POST" action="/request_books/">
{% csrf_token %}
<input type="text" name="book_name" placeholder="Enter the Book Name"
class="form-control my-3">
<input type="text" name="author" placeholder="Enter the Author Name"
class="form-control my-3">
<div class="text-center">
<button tabindex="0" class="btn btn-lg btn-success" role="button"
data-bs-toggle="popover"
data-bs-trigger="focus"
data-bs-title="Request Submitted"
data-bs-content="Your Request for the required Book has been Successfully
submitted...">
27
Request </button>
</div>
</form>
</div>
{% endblock %}
{% block js %}
<script src="{% static 'js/[Link]' %}"></script>
<script
src="[Link]
integrity="sha384-
I7E8VVD/ismYTF4hNIPjVp/Zjvgyol6VFvRkX/vR+Vc4jQkC+hVqc2pM8ODewa9r"
crossorigin="anonymous"></script>
<script>
const popoverTriggerList = [Link]('[data-bs-toggle="popover"]');
const popoverList = [...popoverTriggerList].map(el => new [Link](el));
</script>
{% if thank %}
<script>
alert('We will contact you soon');
[Link] = "/for_users/";
</script>
{% endif %}
{% endblock %}
See request book:
{% extends 'admin_navbar.html' %}
{% block title %} Add Books {% endblock %}
28
{% block profileactive %} active {% endblock profileactive %}
{% block css %}
{% endblock %}
{% block body %}
{% load static %}
<div class="row">
<div class="col-md">
<div class="card card-body">
<h5>All Books Request ({{requested_books_count}})</h5>
</div>
<div class="card card-body">
<table class="table">
<tr>
<th>Customer</th>
<th>Book Name</th>
<th>Author</th>
</tr>
{% for i in requested_book %}
<tr>
<td>{{[Link]}}</td>
<td>{{i.book_name}}</td>
<td>{{[Link]}}</td>
</tr>
{% endfor %} </table> </div> </div> </div> {% endblock
29
CONCLUSION
The Bookstore Management System stands as a practical and user-friendly web application that
streamlines book inventory, customer orders, and user interactions within a responsive interface.
By combining the power of Django for secure and scalable backend processing with Bootstrap
for polished front-end responsiveness, the project effectively balances functionality and design.
Core features such as book management, customer listings, user authentication, role-based
dashboards, book requests, and a dynamic cart with checkout functionality highlight the real-
world utility of the system. The structured use of Django templates, CSRF protection, and
modular views ensures maintainability and security across the platform.
Beyond functionality, this project reinforced hands-on skills in form handling, URL routing,
model integration, and JavaScript-based dynamic rendering—making it a significant milestone
in full-stack development learning. Its layered design allows seamless future expansion to
include features like online payment integration, stock analytics, or personalized
recommendations.
30
REFERENCES
Bootstrap
Bootstrap. (n.d.). Bootstrap v5.0.2 Documentation. Retrieved from:
[Link]
jQuery
The jQuery Foundation. (n.d.). jQuery 3.6.0 Documentation. Retrieved from:
[Link]
[Link]
[Link] Contributors. (n.d.). [Link] Documentation. Retrieved from:
[Link]
Django Templating
Django Software Foundation. (n.d.). Django Template Language Documentation (v4.2).
Retrieved from:
[Link]
Django Web Framework
Django Software Foundation. (n.d.). Django Documentation (v4.2). Retrieved from:
[Link]
CDNJS by Cloudflare
Cloudflare, Inc. (n.d.). cdnjs - The #1 free and open source CDN. Retrieved from:
[Link]
31