{"id":163,"date":"2023-04-04T18:30:50","date_gmt":"2023-04-04T18:30:50","guid":{"rendered":"https:\/\/www.w3computing.com\/articles\/?p=163"},"modified":"2023-08-23T16:22:32","modified_gmt":"2023-08-23T16:22:32","slug":"building-hybrid-applications-flask-django-websockets","status":"publish","type":"post","link":"https:\/\/www.w3computing.com\/articles\/building-hybrid-applications-flask-django-websockets\/","title":{"rendered":"Building Hybrid Applications with Python and Web Technologies: Flask, Django, and WebSockets"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">In the field of web development, hybrid applications have emerged as a powerful approach to building scalable and versatile web-based applications. As an experienced developer, you know that combining the capabilities of Python and web technologies like Flask, Django, and WebSockets can lead to the creation of robust, high-performance applications. In this article, we will guide you through the process of building hybrid applications using these tools and techniques. So, let&#8217;s get started!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1: Understanding Hybrid Applications<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1.1 What are Hybrid Applications?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Hybrid applications are a blend of web and native applications that leverage the advantages of both paradigms. They are built using web technologies like HTML, CSS, and JavaScript, while being packaged within a native application wrapper. This allows them to be distributed through app stores, and access device-specific features like cameras, geolocation, and file systems.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1.2 Why Choose Hybrid Applications?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The benefits of hybrid applications include:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Cross-platform compatibility<\/strong>: Develop once and deploy across multiple platforms (iOS, Android, Windows, etc.)<\/li>\n\n\n\n<li><strong>Faster development<\/strong>: Leverage existing web development skills and reduce time to market<\/li>\n\n\n\n<li><strong>Simplified maintenance<\/strong>: Update the core application without requiring users to download new versions<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">2: Introducing Flask, Django, and WebSockets<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">2.1 Flask: Lightweight Web Framework<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Flask is a micro web framework for Python, designed to build small to medium-sized web applications quickly and efficiently. Its minimalistic approach allows for easy customization and extension, making it a perfect choice for developers who want flexibility in their projects.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Key Flask features:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Simple and easy to use<\/li>\n\n\n\n<li>Highly customizable with extensions<\/li>\n\n\n\n<li>Supports Jinja2 templating engine<\/li>\n\n\n\n<li>RESTful request dispatching<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2.2 Django: The Web Framework for Perfectionists with Deadlines<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Django is a high-level, full-stack web framework for Python that promotes rapid development and clean, pragmatic design. It is perfect for developers who need an all-in-one solution for web development, as it provides a wide range of built-in features.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Key Django features:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Model-View-Template (MVT) architectural pattern<\/li>\n\n\n\n<li>Built-in ORM for database abstraction<\/li>\n\n\n\n<li>Robust admin interface<\/li>\n\n\n\n<li>Supports various caching mechanisms<\/li>\n\n\n\n<li>Comprehensive documentation<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2.3 WebSockets: Real-Time Communication<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">WebSockets is a protocol that enables two-way communication between a client and a server over a long-lived connection. It&#8217;s an excellent choice for real-time applications like chat, notifications, and live updates.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Key WebSockets features:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Bidirectional communication<\/li>\n\n\n\n<li>Low latency<\/li>\n\n\n\n<li>Multiplexing support<\/li>\n\n\n\n<li>Supports binary data and text<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">3: Building a Hybrid Application with Flask, Django, and WebSockets<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">3.1 Designing the Application Architecture<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">To build a hybrid application, start by designing a modular architecture that separates the client-side (HTML, CSS, and JavaScript) from the server-side (Python, Flask\/Django, and WebSockets). This separation allows for easy maintenance and scalability.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3.2 Creating the User Interface<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Design the user interface (UI) using HTML, CSS, and JavaScript. Frameworks like Bootstrap, Foundation, or Materialize can help speed up development and maintain a consistent look and feel.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3.3 Implementing the Server-side with Flask or Django<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Depending on your project&#8217;s requirements, choose Flask or Django as the server-side web framework. Both frameworks provide a solid foundation for building RESTful APIs, which serve as the communication layer between the client-side and server-side.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3.4 Integrating Web Sockets for Real-Time Communication<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">To integrate WebSockets into your hybrid application, use a library like Flask-SocketIO or Django Channels. These libraries allow you to leverage WebSockets alongside your chosen web framework, enabling real-time communication between the client and server.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3.4.1 Flask-SocketIO<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Flask-SocketIO is an extension for Flask that provides WebSocket support, making it easy to add real-time communication to your application. It relies on the Socket.IO protocol, which is widely used in modern web applications.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Key steps for integrating Flask-SocketIO:<\/li>\n\n\n\n<li>Install Flask-SocketIO and its dependencies<\/li>\n\n\n\n<li>Configure the Flask app to use Flask-SocketIO<\/li>\n\n\n\n<li>Define event handlers for WebSocket communication<\/li>\n\n\n\n<li>Use JavaScript Socket.IO client for client-side communication<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">3.4.2 Django Channels<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Django Channels is an extension to Django that enables asynchronous communication, including WebSocket support. It introduces the concept of channels and channel layers to handle real-time events.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Key steps for integrating Django Channels:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Install Django Channels and its dependencies<\/li>\n\n\n\n<li>Configure Django settings to use Channels<\/li>\n\n\n\n<li>Create an ASGI application and routing configuration<\/li>\n\n\n\n<li>Define WebSocket consumers for handling communication<\/li>\n\n\n\n<li>Use JavaScript WebSocket API for client-side communication<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">3.5 Packaging the Hybrid Application<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Once your application is complete, package it using a hybrid app development framework like Apache Cordova, Ionic, or React Native. These frameworks allow you to wrap your web application in a native container, enabling distribution through app stores and access to device-specific features.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4: Best Practices for Building Hybrid Applications<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">4.1 Optimize Performance<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Hybrid applications can suffer from performance issues if not properly optimized. Use techniques like lazy loading, caching, and minification to improve performance and reduce load times.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4.2 Responsive Design<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ensure that your hybrid application&#8217;s user interface is responsive and adapts to different screen sizes and orientations.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4.3 Security<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Implement robust security measures to protect your application and its users. Use HTTPS, secure cookies, and validate user input to prevent common security vulnerabilities.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4.4 Testing<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Thoroughly test your hybrid application across different platforms and devices to ensure a consistent user experience.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4.5 Scalability<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Design your application with scalability in mind, using modular architecture, horizontal scaling, and load balancing to accommodate growing user bases and increased demand.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Example Exercise<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In this example, we&#8217;ll create a collaborative drawing board application using Django, Django Channels, and JavaScript. We&#8217;ll introduce user authentication, rooms for separate drawing boards, and more drawing tools.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 1: Set up the project<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">First, create a new directory for the project and set up a virtual environment:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\">mkdir django_collaborative_drawing_board\ncd django_collaborative_drawing_board\npython3 -m venv venv\nsource venv\/bin\/activate<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Step 2: Install dependencies<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Install Django, Django Channels, channels-redis, and Pillow:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\">pip install Django channels channels-redis Pillow\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Step 3: Create the Django project and app<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Create a new Django project called <code><strong>drawing_board_project<\/strong><\/code> and a new Django app called <code><strong>drawing_board<\/strong><\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\">django-admin startproject drawing_board_project\ncd drawing_board_project\npython manage.py startapp drawing_board<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Step 4: Configure Django settings<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Edit <strong><code>drawing_board_project\/settings.py<\/code><\/strong> and configure Django Channels:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"Django\" data-shcb-language-slug=\"django\"><span><code class=\"hljs language-django\"><span class=\"xml\">INSTALLED_APPS = &#91;\n    # ...\n    'channels',\n    'drawing_board',\n]\n\n# Add the following lines at the end of the file\nCHANNEL_LAYERS = {\n    'default': {\n        'BACKEND': 'channels_redis.core.RedisChannelLayer',\n        'CONFIG': {\n            'hosts': &#91;('127.0.0.1', 6379)],\n        },\n    },\n}\n\nASGI_APPLICATION = 'drawing_board_project.routing.application'<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Django<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">django<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Step 5: Configure Django routing<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Create a new file called <code><strong>routing.py<\/strong><\/code> in the `<code><strong>drawing_board_project<\/strong><\/code>` directory and add the following code:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"Django\" data-shcb-language-slug=\"django\"><span><code class=\"hljs language-django\"><span class=\"xml\">from channels.routing import ProtocolTypeRouter, URLRouter\nfrom django.urls import path\nfrom channels.auth import AuthMiddlewareStack\n\nfrom drawing_board import consumers\n\napplication = ProtocolTypeRouter(\n    {\n        \"http\": get_asgi_application(),\n        \"websocket\": AuthMiddlewareStack(\n            URLRouter(\n                &#91;\n                    path(\"ws\/drawing_board\/<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">str:room_name<\/span>&gt;<\/span>\/\", consumers.DrawingBoardConsumer.as_asgi()),\n                ]\n            )\n        ),\n    }\n)<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Django<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">django<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Step 6: Create the DrawingBoardConsumer<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Edit <strong><code>drawing_board\/consumers.py<\/code><\/strong> and add the following code:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"Django\" data-shcb-language-slug=\"django\"><span><code class=\"hljs language-django\"><span class=\"xml\">import json\nfrom channels.generic.websocket import AsyncWebsocketConsumer\n\nclass DrawingBoardConsumer(AsyncWebsocketConsumer):\n    async def connect(self):\n        self.room_name = self.scope&#91;'url_route']&#91;'kwargs']&#91;'room_name']\n        self.room_group_name = f'drawing_board_{self.room_name}'\n\n        await self.channel_layer.group_add(self.room_group_name, self.channel_name)\n        await self.accept()\n\n    async def disconnect(self, close_code):\n        await self.channel_layer.group_discard(self.room_group_name, self.channel_name)\n\n    async def receive(self, text_data):\n        text_data_json = json.loads(text_data)\n        action = text_data_json&#91;'action']\n        data = text_data_json&#91;'data']\n\n        await self.channel_layer.group_send(self.room_group_name, {'type': 'broadcast', 'action': action, 'data': data})\n\n    async def broadcast(self, event):\n        action = event&#91;'action']\n        data = event&#91;'data']\n\n        await self.send(text_data=json.dumps({'action': action, 'data': data}))<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Django<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">django<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Step 7: Set up user authentication<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Edit <strong><code>drawing_board_project\/settings.py<\/code><\/strong> and add &#8216;<code><strong>django.contrib.sessions.middleware.SessionMiddleware<\/strong><\/code>&#8216; and &#8216;<strong><code>django.contrib.auth.middleware.AuthenticationMiddleware<\/code><\/strong>&#8216; to the MIDDLEWARE list. Also, add the <code><strong>LOGIN_URL<\/strong><\/code> and <strong><code>LOGIN_REDIRECT_URL<\/code><\/strong> at the end of the file:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"Django\" data-shcb-language-slug=\"django\"><span><code class=\"hljs language-django\"><span class=\"xml\">MIDDLEWARE = &#91;\n    # ...\n    'django.contrib.sessions.middleware.SessionMiddleware',\n    'django.contrib.auth.middleware.AuthenticationMiddleware',\n]\n\n# Add the following lines at the end of the file\nLOGIN_URL = 'login'\nLOGIN_REDIRECT_URL = 'drawing_board'<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Django<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">django<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Step 8: Create views and templates<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Create a new directory called <strong><code>templates<\/code><\/strong> inside the <code><strong>drawing_board directory<\/strong><\/code>. Inside <strong><code>templates<\/code><\/strong>, create another directory named <code><strong>drawing_board<\/strong><\/code> and create the following HTML files:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>login.html<\/code><\/strong> for the login form.<\/li>\n\n\n\n<li><strong><code>drawing_board.html<\/code><\/strong> for the drawing board.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Edit <strong><code>drawing_board\/views.py<\/code><\/strong> and create views for login and drawing board pages:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">from<\/span> django.shortcuts <span class=\"hljs-keyword\">import<\/span> render, redirect\n<span class=\"hljs-keyword\">from<\/span> django.contrib.auth <span class=\"hljs-keyword\">import<\/span> authenticate, login\n<span class=\"hljs-keyword\">from<\/span> django.contrib.auth.decorators <span class=\"hljs-keyword\">import<\/span> login_required\n\ndef login_view(request):\n    <span class=\"hljs-keyword\">if<\/span> request.method == <span class=\"hljs-string\">'POST'<\/span>:\n        username = request.POST&#91;<span class=\"hljs-string\">'username'<\/span>]\n        password = request.POST&#91;<span class=\"hljs-string\">'password'<\/span>]\n        user = authenticate(request, username=username, password=password)\n        <span class=\"hljs-keyword\">if<\/span> user is not None:\n            login(request, user)\n            <span class=\"hljs-keyword\">return<\/span> redirect(<span class=\"hljs-string\">'drawing_board'<\/span>, room_name=<span class=\"hljs-string\">\"default\"<\/span>)\n        <span class=\"hljs-attr\">else<\/span>:\n            <span class=\"hljs-keyword\">return<\/span> render(request, <span class=\"hljs-string\">'drawing_board\/login.html'<\/span>, {<span class=\"hljs-string\">'error_message'<\/span>: <span class=\"hljs-string\">'Invalid credentials'<\/span>})\n    <span class=\"hljs-attr\">else<\/span>:\n        <span class=\"hljs-keyword\">return<\/span> render(request, <span class=\"hljs-string\">'drawing_board\/login.html'<\/span>)\n\n@login_required\ndef drawing_board(request, room_name):\n    <span class=\"hljs-keyword\">return<\/span> render(request, <span class=\"hljs-string\">'drawing_board\/drawing_board.html'<\/span>, {<span class=\"hljs-string\">'room_name'<\/span>: room_name})<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Step 9: Create URL patterns<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Edit <strong><code>drawing_board\/urls.py<\/code><\/strong> and add URL patterns for login and drawing board views:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"Django\" data-shcb-language-slug=\"django\"><span><code class=\"hljs language-django\"><span class=\"xml\">from django.urls import path\nfrom . import views\n\nurlpatterns = &#91;\n    path('login\/', views.login_view, name='login'),\n    path('<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">str:room_name<\/span>&gt;<\/span>\/', views.drawing_board, name='drawing_board'),\n]<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Django<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">django<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Edit <strong><code>drawing_board_project\/urls.py<\/code><\/strong> and include the <code><strong>drawing_board<\/strong><\/code> app&#8217;s URL patterns:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"Django\" data-shcb-language-slug=\"django\"><span><code class=\"hljs language-django\"><span class=\"xml\">from django.contrib import admin\nfrom django.urls import path, include\n\nurlpatterns = &#91;\n    path('admin\/', admin.site.urls),\n    path('drawing_board\/', include('drawing_board.urls')),\n]<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Django<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">django<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Step 10: Create the login and drawing board templates<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Inside the <strong><code>drawing_board\/templates\/drawing_board<\/code><\/strong> directory, create <code><strong>login.html<\/strong><\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-meta\">&lt;!DOCTYPE <span class=\"hljs-meta-keyword\">html<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">html<\/span> <span class=\"hljs-attr\">lang<\/span>=<span class=\"hljs-string\">\"en\"<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">head<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta<\/span> <span class=\"hljs-attr\">charset<\/span>=<span class=\"hljs-string\">\"UTF-8\"<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"viewport\"<\/span> <span class=\"hljs-attr\">content<\/span>=<span class=\"hljs-string\">\"width=device-width, initial-scale=1.0\"<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">title<\/span>&gt;<\/span>Login<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">title<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">head<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n    {% if error_message %}\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span>&gt;<\/span>{{ error_message }}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n    {% endif %}\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">form<\/span> <span class=\"hljs-attr\">method<\/span>=<span class=\"hljs-string\">\"post\"<\/span> <span class=\"hljs-attr\">action<\/span>=<span class=\"hljs-string\">\"{% url 'login' %}\"<\/span>&gt;<\/span>\n        {% csrf_token %}\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">label<\/span> <span class=\"hljs-attr\">for<\/span>=<span class=\"hljs-string\">\"username\"<\/span>&gt;<\/span>Username:<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">label<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"text\"<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"username\"<\/span> <span class=\"hljs-attr\">required<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">br<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">label<\/span> <span class=\"hljs-attr\">for<\/span>=<span class=\"hljs-string\">\"password\"<\/span>&gt;<\/span>Password:<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">label<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"password\"<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"password\"<\/span> <span class=\"hljs-attr\">required<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">br<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"submit\"<\/span>&gt;<\/span>Login<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">form<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">html<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Next, create <strong><code>drawing_board.html<\/code><\/strong>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-meta\">&lt;!DOCTYPE <span class=\"hljs-meta-keyword\">html<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">html<\/span> <span class=\"hljs-attr\">lang<\/span>=<span class=\"hljs-string\">\"en\"<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">head<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta<\/span> <span class=\"hljs-attr\">charset<\/span>=<span class=\"hljs-string\">\"UTF-8\"<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"viewport\"<\/span> <span class=\"hljs-attr\">content<\/span>=<span class=\"hljs-string\">\"width=device-width, initial-scale=1.0\"<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">title<\/span>&gt;<\/span>Collaborative Drawing Board<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">title<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">style<\/span>&gt;<\/span><span class=\"css\">\n        <span class=\"hljs-selector-tag\">canvas<\/span> {\n            <span class=\"hljs-attribute\">border<\/span>: <span class=\"hljs-number\">1px<\/span> solid black;\n        }\n    <\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">style<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">head<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">h1<\/span>&gt;<\/span>{{ room_name }}'s Drawing Board<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">h1<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">canvas<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"drawing-board\"<\/span> <span class=\"hljs-attr\">width<\/span>=<span class=\"hljs-string\">\"800\"<\/span> <span class=\"hljs-attr\">height<\/span>=<span class=\"hljs-string\">\"600\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">canvas<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span> <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/socket.io\/4.4.1\/socket.io.min.js\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span>&gt;<\/span><span class=\"javascript\">\n        <span class=\"hljs-keyword\">const<\/span> socket = io.connect(<span class=\"hljs-string\">'http:\/\/'<\/span> + <span class=\"hljs-built_in\">document<\/span>.domain + <span class=\"hljs-string\">':'<\/span> + location.port + <span class=\"hljs-string\">'\/ws\/drawing_board\/{{ room_name }}\/'<\/span>);\n        <span class=\"hljs-keyword\">const<\/span> canvas = <span class=\"hljs-built_in\">document<\/span>.getElementById(<span class=\"hljs-string\">'drawing-board'<\/span>);\n        <span class=\"hljs-keyword\">const<\/span> context = canvas.getContext(<span class=\"hljs-string\">'2d'<\/span>);\n        <span class=\"hljs-keyword\">let<\/span> drawing = <span class=\"hljs-literal\">false<\/span>;\n\n        canvas.addEventListener(<span class=\"hljs-string\">'mousedown'<\/span>, (event) =&gt; {\n            drawing = <span class=\"hljs-literal\">true<\/span>;\n            context.beginPath();\n            context.moveTo(event.clientX - canvas.offsetLeft, event.clientY - canvas.offsetTop);\n        });\n\n        canvas.addEventListener(<span class=\"hljs-string\">'mousemove'<\/span>, (event) =&gt; {\n            <span class=\"hljs-keyword\">if<\/span> (!drawing) <span class=\"hljs-keyword\">return<\/span>;\n            <span class=\"hljs-keyword\">const<\/span> x = event.clientX - canvas.offsetLeft;\n            <span class=\"hljs-keyword\">const<\/span> y = event.clientY - canvas.offsetTop;\n            context.lineTo(x, y);\n            context.stroke();\n            socket.emit(<span class=\"hljs-string\">'drawing'<\/span>, { <span class=\"hljs-string\">'x'<\/span>: x, <span class=\"hljs-string\">'y'<\/span>: y });\n        });\n\n        canvas.addEventListener(<span class=\"hljs-string\">'mouseup'<\/span>, () =&gt; {\n            drawing = <span class=\"hljs-literal\">false<\/span>;\n        });\n\n        socket.on(<span class=\"hljs-string\">'drawing'<\/span>, (data) =&gt; {\n            context.lineTo(data.x, data.y);\n            context.stroke();\n        });\n    <\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">html<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Step 11: Start the Redis server<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ensure the Redis server is running before launching the Django development server. You can start the Redis server using the following command:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\">redis-server<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Step 12: Run the Django development server<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">With the Redis server running, launch the Django development server:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"Bash\" data-shcb-language-slug=\"bash\"><span><code class=\"hljs language-bash\">python manage.py runserver\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Bash<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">bash<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Now you can visit <code><strong>http:\/\/localhost:8000\/drawing_board\/login\/<\/strong><\/code> to access the collaborative drawing board application. Users can log in and draw on a shared canvas in real-time.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Remember that this example is just a starting point. You can expand this application by adding user registration, more drawing tools, and other features to make it even more powerful and versatile.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the field of web development, hybrid applications have emerged as a powerful approach to building scalable and versatile web-based applications. As an experienced developer, you know that combining the capabilities of Python and web technologies like Flask, Django, and WebSockets can lead to the creation of robust, high-performance applications. In this article, we will [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[4,6],"tags":[],"class_list":["post-163","post","type-post","status-publish","format-standard","category-programming-languages","category-python","entry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Building Hybrid Applications with Python and Web Technologies<\/title>\n<meta name=\"description\" content=\"In this article, we will guide you through the process of building hybrid applications using Flask, Django, and WebSockets\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.w3computing.com\/articles\/building-hybrid-applications-flask-django-websockets\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Building Hybrid Applications with Python and Web Technologies\" \/>\n<meta property=\"og:description\" content=\"In this article, we will guide you through the process of building hybrid applications using Flask, Django, and WebSockets\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.w3computing.com\/articles\/building-hybrid-applications-flask-django-websockets\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-04-04T18:30:50+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-23T16:22:32+00:00\" \/>\n<meta name=\"author\" content=\"w3compadmin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"w3compadmin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"TechArticle\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/building-hybrid-applications-flask-django-websockets\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/building-hybrid-applications-flask-django-websockets\\\/\"},\"author\":{\"name\":\"w3compadmin\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\"},\"headline\":\"Building Hybrid Applications with Python and Web Technologies: Flask, Django, and WebSockets\",\"datePublished\":\"2023-04-04T18:30:50+00:00\",\"dateModified\":\"2023-08-23T16:22:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/building-hybrid-applications-flask-django-websockets\\\/\"},\"wordCount\":1163,\"commentCount\":0,\"articleSection\":[\"Programming Languages\",\"Python\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/building-hybrid-applications-flask-django-websockets\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/building-hybrid-applications-flask-django-websockets\\\/\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/building-hybrid-applications-flask-django-websockets\\\/\",\"name\":\"Building Hybrid Applications with Python and Web Technologies\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#website\"},\"datePublished\":\"2023-04-04T18:30:50+00:00\",\"dateModified\":\"2023-08-23T16:22:32+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\"},\"description\":\"In this article, we will guide you through the process of building hybrid applications using Flask, Django, and WebSockets\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/building-hybrid-applications-flask-django-websockets\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/building-hybrid-applications-flask-django-websockets\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/building-hybrid-applications-flask-django-websockets\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Articles Home\",\"item\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Programming Languages\",\"item\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/programming-languages\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Building Hybrid Applications with Python and Web Technologies: Flask, Django, and WebSockets\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#website\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/\",\"name\":\"Developer Articles Hub\",\"description\":\"\",\"alternateName\":\"Developer Articles\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\",\"name\":\"w3compadmin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266\",\"contentUrl\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266\",\"caption\":\"w3compadmin\"},\"sameAs\":[\"http:\\\/\\\/w3computing.com\\\/articles\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Building Hybrid Applications with Python and Web Technologies","description":"In this article, we will guide you through the process of building hybrid applications using Flask, Django, and WebSockets","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.w3computing.com\/articles\/building-hybrid-applications-flask-django-websockets\/","og_locale":"en_US","og_type":"article","og_title":"Building Hybrid Applications with Python and Web Technologies","og_description":"In this article, we will guide you through the process of building hybrid applications using Flask, Django, and WebSockets","og_url":"https:\/\/www.w3computing.com\/articles\/building-hybrid-applications-flask-django-websockets\/","article_published_time":"2023-04-04T18:30:50+00:00","article_modified_time":"2023-08-23T16:22:32+00:00","author":"w3compadmin","twitter_card":"summary_large_image","twitter_misc":{"Written by":"w3compadmin","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"TechArticle","@id":"https:\/\/www.w3computing.com\/articles\/building-hybrid-applications-flask-django-websockets\/#article","isPartOf":{"@id":"https:\/\/www.w3computing.com\/articles\/building-hybrid-applications-flask-django-websockets\/"},"author":{"name":"w3compadmin","@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561"},"headline":"Building Hybrid Applications with Python and Web Technologies: Flask, Django, and WebSockets","datePublished":"2023-04-04T18:30:50+00:00","dateModified":"2023-08-23T16:22:32+00:00","mainEntityOfPage":{"@id":"https:\/\/www.w3computing.com\/articles\/building-hybrid-applications-flask-django-websockets\/"},"wordCount":1163,"commentCount":0,"articleSection":["Programming Languages","Python"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.w3computing.com\/articles\/building-hybrid-applications-flask-django-websockets\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.w3computing.com\/articles\/building-hybrid-applications-flask-django-websockets\/","url":"https:\/\/www.w3computing.com\/articles\/building-hybrid-applications-flask-django-websockets\/","name":"Building Hybrid Applications with Python and Web Technologies","isPartOf":{"@id":"https:\/\/www.w3computing.com\/articles\/#website"},"datePublished":"2023-04-04T18:30:50+00:00","dateModified":"2023-08-23T16:22:32+00:00","author":{"@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561"},"description":"In this article, we will guide you through the process of building hybrid applications using Flask, Django, and WebSockets","breadcrumb":{"@id":"https:\/\/www.w3computing.com\/articles\/building-hybrid-applications-flask-django-websockets\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.w3computing.com\/articles\/building-hybrid-applications-flask-django-websockets\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.w3computing.com\/articles\/building-hybrid-applications-flask-django-websockets\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Articles Home","item":"https:\/\/www.w3computing.com\/articles\/"},{"@type":"ListItem","position":2,"name":"Programming Languages","item":"https:\/\/www.w3computing.com\/articles\/programming-languages\/"},{"@type":"ListItem","position":3,"name":"Building Hybrid Applications with Python and Web Technologies: Flask, Django, and WebSockets"}]},{"@type":"WebSite","@id":"https:\/\/www.w3computing.com\/articles\/#website","url":"https:\/\/www.w3computing.com\/articles\/","name":"Developer Articles Hub","description":"","alternateName":"Developer Articles","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.w3computing.com\/articles\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561","name":"w3compadmin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266","url":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266","contentUrl":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266","caption":"w3compadmin"},"sameAs":["http:\/\/w3computing.com\/articles"]}]}},"featured_image_src":null,"featured_image_src_square":null,"author_info":{"display_name":"w3compadmin","author_link":"https:\/\/www.w3computing.com\/articles\/author\/w3compadmin\/"},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/163","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/comments?post=163"}],"version-history":[{"count":7,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/163\/revisions"}],"predecessor-version":[{"id":171,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/163\/revisions\/171"}],"wp:attachment":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/media?parent=163"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/categories?post=163"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/tags?post=163"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}