Python API Development – Comprehensive Course for Beginners

Ecommerce Empire Academy

Learn Python API development in one of the most comprehensive courses ever on the topic. You will build a full-fledged API in Python using FastAPI. You will learn the fundamentals of API design including routes, serialization/deserialization, schema validation, and models. You will also learn about SQL, testing with pytest, and how to build out a CI/CD pipeline using GitHub actions.

💻 Code:

✏️ Course from Sanjeev Thiyagarajan. Check out his channel:

⭐️ Course Contents
00:00 Intro
06:33 Project Overview
11:22 Mac Python Installation
13:15 Mac VS Code install and setup
16:37 Windows Python Installation
18:30 Windows VS Code install and setup
22:11 Python virtual Env Basics
24:35 Virtual Env on windows
28:56 Virtual Env on Mac
34:17 Install dependencies w/ pip
36:21 Starting FastAPI
39:23 Path Operations
53:22 Intro toman
57:34 HTTP Requests
1:07:29 Schema Validation with Pydantic
1:22:45 CRUD Operations
1:29:44 Storing in Array
1:34:06 Creating
1:38:15 Postman Collections & saving requests
1:39:47 Retrieve One
1:48:10 Path order Matters
1:52:46 Changing response Status Codes
2:01:49 Deleting
2:10:31 Updating
2:18:02 Automatic Documentation
2:21:34 Python packages
2:24:11 Database Intro
2:28:54 Postgres Windows Install
2:31:28 Postgres Mac Install
2:34:26 Database Schema & Tables
2:44:35 Managing Postgres with PgAdmin GUI
3:12:10 Your first SQL Query
3:19:43 Filter results with "where"
3:22:55 SQL Operators
3:26:38 IN
3:28:07 Pattern matching with LIKE
3:31:59 Ordering Results
3:36:27 LIMIT & OFFSET
3:39:21 Modifying Data
3:53:48 Setup App Database
3:58:21 Connecting to database w/ Python
4:08:00 Database CRUD
4:31:18 ORM intro
4:35:33 SQLALCHEMY setup
4:55:25 Adding CreatedAt Column
5:00:59 Get All
5:07:55 Create
5:15:50 Get by ID
5:19:50 Delete
5:22:31 Update
5:28:21 Pydantic vs ORM Models
5:32:21 Pydantic Models Deep Dive
5:38:57 Response Model
5:50:08 Creating Users Table
5:54:50 User Registration Path Operation
6:03:27 Hashing Passwords
6:08:49 Refractor Hashing Logic
6:10:32 Get User by ID
6:17:13 FastAPI Routers
6:27:34 Router Prefix
6:30:31 Router Tags
6:32:49 JWT Token Basics
6:47:03 Login Process
7:00:44 Creating Token
7:09:58 OAuth2 PasswordRequestForm
7:13:23 Verify user is Logged In
7:25:21 Fixing Bugs
7:27:59 Protecting Routes
7:36:17 Test Expired Token
7:38:13 Fetching User in Protected Routes
7:42:44 Postman advanced Features
7:50:33 SQL Relationship Basics
7:54:59 Postgres Foreign Keys
8:07:20 SQLAlchemy Foreign Keys
8:13:40 Update Schema to include User
8:17:59 Assigning Owner id when creating new
8:21:01 Delete and Update only your own
8:27:48 Only Retrieving Logged in User's
8:33:37 Sqlalchemy Relationships
8:38:32 Query Parameters
8:50:46 Cleanup our main.py file
8:53:53 Env Variables
9:21:20 Vote/Like Theory
9:26:36 Votes Table
9:31:33 Votes Sqlalchemy
9:34:11 Votes Route
9:52:31 SQL Joins
10:15:26 Joins in SqlAlchemy
10:28:21 Get One with Joins
10:30:18 What is a database migration tool
10:33:45 Alembic Setup
11:13:50 Disable SqlAlchemy create Engine
11:14:28 What is CORS?
11:23:38 Git PreReqs
11:27:40 Git Install
11:29:23 Github
11:34:39 Heroku intro
11:35:40 Create Heroku App
11:40:21 Heroku procfile
11:44:59 Adding a Postgres database
11:48:42 Env Variables in Heroku
11:58:59 Alembic migrations on Heroku Postgres instance
12:02:52 Pushing changed to production
12:05:04 Create an Ubuntu VM
12:08:04 Update packages
12:10:47 Install Python
12:12:21 Install Postgres & setup password
12:17:28 Postgres Config
12:24:50 Create new user and setup python evironment
12:34:06 Env Variables
12:42:24 Alembic migrations on production database
12:45:57 Gunicorn
12:54:12 Creating a Systemd service
13:04:45 NGINX
13:10:45 Setting up Domain name
13:15:19 SSL/HTTPS
13:19:31 NGINX enable
13:20:06 Firewall
13:23:47 Pushing code changes to Production
13:26:09 Dockerfile
13:38:39 Docker Compose
13:48:34 Postgres Container
13:56:22 Bind Mounts
14:03:39 Dockerhub
14:08:08 Production vs Development
14:14:51 Testing Intro
14:17:19 Writing your first test
14:30:22 The -s & -v flags
14:31:44 Testing more functions
14:35:29 Parametrize
14:40:21 Testing Classes
14:48:37 Fixtures
14:55:40 Combining Fixtures + Parametrize
14:59:13 Testing Exceptions
15:06:07 FastAPI TestClient
15:14:26 Pytest flags
15:17:31 Test create user
15:25:23 Setup testing database
15:36:47 Create & destroy database after each test
15:44:18 More Fixtures to handle database interaction
15:50:35 Trailing slashes in path
15:53:12 Fixture scope
16:07:50 Test user fixture
16:14:40 Test/validate token
16:18:59 Conftest.py
16:22:09 Testing
17:34:15 CI/CD intro
17:43:29 Github Actions
17:49:32 Creating Jobs
17:57:38 setup python/dependencies/pytest
18:06:14 Env variables
18:11:19 Github Secrets
18:18:14 Testing database
18:23:42 Building Docker images
18:34:33 Deploy to heroku
18:49:10 Failing tests in pipeline
18:52:18 Deploy to Ubuntu

61 thoughts on “Python API Development – Comprehensive Course for Beginners”

    1. Daniel Simamora

      has anyone finished this? how was it? is it suitable for me who only knows Python?
      well, I know some HTML CSS JS to build simple website. because Im trying to deploy my Machine Learning project which is from Python libraries, into a sort of simple web app…

    2. I mentally can’t even comprehend how we have God-like level content like this on youtube. FreeCodeCamp alone has changed my life.

    3. Mustafa KÖRÜKMEZ

      @42AloneMusk fastapi ile alakalı bir video bakıyorsan geçmiş olsun 7 ay olmuş hala yok en kaliteli içerik bu

  1. I’m going to watch this whole course 2 hours a day. So many concepts i’ve wanted to learn in one package, amazing!

    1. Daniel Simamora

      have you finished this? how was it? is it suitable for me who only knows Python?
      well, I know some HTML CSS JS to build simple website. because Im trying to deploy my Machine Learning project which is from Python libraries, into a sort of simple web app…

    2. @Charles Stone i don’t think you should be on this video if you can’t do super basic math… just saying.

  2. Maria Luisa Rosales

    This is amazing. Just two hours in and I have learned more than with other courses which were way longer. I can’t believe this is free! Thank you so much ❤️

    1. Guillermo Moreira

      Estoy en el mismo camino! Estaba aprendiendo django pero luego de ver un poco lo completo que es este curso y lo que ofrece FastAPI decidí cambiarlo y comenzar este curso!

  3. People pay more than $2000 for Python lectures and they don’t come close to quality content like this. YOU ARE ABSOLUTE LEGENDS!

    1. Daniel Simamora

      @The Blind Programmer well there are multiple people here, i really need a help, so anyone can respond 😭😭

    2. The Blind Programmer

      @Daniel Simamora So, which stage are you in, did you finish your ML project and want to deploy it? or you need help with the ML project itself

    3. Daniel Simamora

      @The Blind Programmer well, first im a beginner and a non computer science student, I learn this on initiative.

      I build it in jupyter notebook and google colab, which is fully Python. So I’m already able to give input, process it (like transform data, split it, and train it), and give the output.

      but you know it’s still a notebook. I want to build a web app, so it’s become interactive, and much better to deploy and host it so I can share it with new friends.

      my knowledge in web dev is some HTML, CSS, JS, PHP, MySQL. And currently learning this FastAPI. My knowledge is still like scratching the surface though.

      thank you for your support 🙏

    4. The Blind Programmer

      @Daniel Simamora Have you checked this channel: Corey Schafer, that guy knows his stuff, and he has a plaaylist showing you how to create web apps.

  4. The issue around 4:23:53 (and actually I also believe the issue around why it’s not accepting an int) is because the cursor.execute() function expects a Tuple as the second argument. Without the comma the parenthesis are meaningless. cursor.execute(“””SELECT * FROM posts WHERE id=%s”””, (id,)) works just fine

    1. Close, but not quite accurate. It’s because it’s expecting an indexable object. an int isn’t indexable . A tuple is, so that works, so does an array [id] or even {id} as well as the tuple (id,)

    2. Christopher Grubb

      @James Reader Right. vars needs to be indexable, so (id,) or [id] is best. Converting id into a string only works when using a single digit id. If you try with id=10, then it would take the first index (which is ’10′[0], so ‘1’) for the first %s, but not know what to do with the second index (which is ’10′[1] , so ‘0’). So you would get a TypeError, since not all arguments ‘1’ and ‘0’ would be able to be converted during string formatting.

  5. This is an amazing course. Sanjeev has really done a good job to explain all the conepts very clearly. Although it is a 19 hour course, but it is so engaging that you just go with the flow.

  6. Антон Ладанев

    Amazing course! Thanks a lot
    10:25:00 issue was in inheritance from PostBase instead of BaseModel. Not in capital or lower letter. Hope will help someone

    1. @Dheeraj hi bro, can you share the code, will try to help , mostly the errors arise from spelling mistakes , please try to cross check the lines in your code with Sanjeev’s.

    2. Sahil Singhai

      Also inside the func(label()) where you are passing name should be the same as in postout class int returning variable’s name

  7. Luca Dalla Valle

    For those wondering, at 10:15:39, the bug was that he made the class PostOut inherit from PostBase instead of BaseModel. It was throwing errors because Pydantic was expecting all the members of class PostBase to be present in the object returned by the API.

    1. Luca Dalla Valle

      @Daniel Simamora I think the course is well worth your time if you never used python in a real-world project. I have skipped the deploy part btw. I also suggest to watch in 1.25x or even 1.50x

    2. Daniel Simamora

      @Luca Dalla Valle i used Python a lot just in data science and machine learning related libraries, like pandas numpy sklearn tensorflow and some others. But never had experience for webdev, like django, flask, and fastapi. My understanding in other website language like html css JS PHP are still on the surface.

      but i need to do my school project. where I deploy my ML (which I mostly done only in Jupyter Notebook or Google Colab, which is not attractive), so I can make a simple web app….

    3. Hi, I am having a problem while importing BaseModel from pydantic. The error says its unresolved. I have done all installations mentioned here. Please could you help me?

    4. I am getting this error
      pydantic.error_wrappers.ValidationError: 1 validation error for Token
      response -> acccess_token
      field required (type=value_error.missing)
      can you please help me regarding this issue

    5. Yuvraj Singh Shekhawat

      i am facing this error while importing psycopg2 Import “psycopg2.extras” could not be resolved from sourcePylancereportMissingModuleSource

  8. Timestamps for entire course(this is copied from by Sanjeev Thiyagarajan video in his channel):

    -Section 1 – Intro—
    Course Project
    00:10 – Course Intro
    06:33 – Course Project Overview

    Section 2 – Setup & installation——–
    11:22 – Mac Python Installation
    13:15 – Mac Vscode install and setup
    16:37 – Windows Python Installation
    18:30 – Windows vscode install and setup
    22:11 – Python virtual environment Basics
    24:35 – Virtual environment on windows
    28:56 – Virtual environment on Mac

    — Section 3 FastApi————————-
    34:17 – 10 Install dependencies w/ pip
    36:21 – 11 starting fastapi
    39:23 – 12. path operations
    48:25 – 13 Path Operation Order(yes it matters)
    53:22 – 14 Intro to Postman
    57:34 – 15 HTTP Post Requests
    01:07:29 – 16 Schema Validation with Pydantic
    01:22:45 – 17 CRUD Operations
    01:29:44 – 18 storing posts in Array
    01:34:06 – 19 creating posts
    01:38:15 – 20 Postman Collections & saving requests
    01:39:47 – 21 Retrieve One Post
    01:48:10 – 22 Path order Matters
    01:52:46 – 23 Changing response Status Codes
    02:01:49 – 24 Deleting Posts
    02:10:31 – 25 Updating Posts
    02:18:02 – 26 Automatic Documentation
    02:21:34 – 27 Python packages

    ——– Section 4 Databases—————
    02:24:11 – 28 Database Intro
    02:28:54 – 29 Postgres Windows Install
    02:31:28 – 30 Postgres Mac Install
    02:34:26 – 31 Database Schema & Tables
    02:44:35 – 32 Managing Postgres with PgAdmin GUI
    03:12:10 – 33 Your first SQL Query
    03:19:43 – 34 Filter results with “where” keyword
    03:22:55 – 35 SQL Operators
    03:26:38 – 36 IN Keyword
    03:28:07 – 37 Pattern matching with LIKE keyword
    03:31:59 – 38 Ordering Results
    03:36:27 – 39 LIMIT & OFFSET
    03:39:21 – 40 Inserting Data
    03:47:07 – 41 Deleting Data
    03:49:57 – 42 Updating Data

    ——–Section 5 Python + Raw SQL —————————–
    03:53:48 – 43 Setup App Database
    03:58:21 – 44 Connecting to database w/ Python
    04:08:00 – 45 Retrieving Posts
    04:11:35 – 46 Creating Post
    04:19:17 – 47 Get One Post
    04:24:12 – 48 Delete Post
    04:26:30 – 49 Update Post

    ———Section 6 ORMs —————————–
    04:31:18 – 50 ORM intro
    04:35:33 – 50 SQLALCHEMY setup
    04:55:25 – 51 Adding CreatedAt Column
    05:00:59 – 52 Get All Posts
    05:07:55 – 53 Create Posts
    05:15:50 – 54 Get Post by ID
    05:19:50 – 55 Delete Post
    05:22:31 – 56 Update Post

    ————Section 7 Pydantic Models ————–
    05:28:21 – 57 Pydantic vs ORM Models
    05:32:21 – 58 Pydantic Models Deep Dive
    05:38:57 – 59 Response Model

    ———–Section 8 Authentication & Users ——-
    05:50:08 – 63 Creating Users Table
    05:54:50 – 64 User Registration Path Operation
    06:03:27 – 65 Hashing User Passwords
    06:08:49 – 66 Refractor Hashing Logic
    06:10:32 – 67 Get User by ID
    06:17:13 – 68 FastAPI Routers
    06:27:34 – 69 Router Prefix
    06:30:31 – 70 Router Tags
    06:32:49 – 80 JWT Token Basics
    06:47:03 – 81 Login Process
    07:00:44 – 82 Creating a Token
    07:09:58 – 83 OAuth2 PasswordRequestForm
    07:13:23 – 84 Verify user is Logged In
    07:25:21 – 85 Fixing Bugs
    07:27:59 – 86 Protecting Routes
    07:36:17 – 87 Test Expired Token
    07:38:13 – 88 Fetching User in Protected Routes
    07:42:44 – 89 Postman advanced Features

    ————–Section 9 Relationships——————-
    07:50:33 – 90 SQL Relationship Basics
    07:54:59 – 91 Postgres Foreign Keys
    08:07:20 – 92 SQLAlchemy Foreign Keys
    08:13:40 – 93 Update Post Schema to include User
    08:17:59 – 94 Assigning Owner id when creating new post
    08:21:01 – 95 Delete and Update only your own posts
    08:27:48 – 96 Only Retrieving Logged in User’s posts
    08:33:37 – 97 Sqlalchemy Relationships
    08:38:32 – 98 Query Parameters
    08:50:46 – 99 Cleanup our main.py file
    08:53:53 – 100 Environment Variables

    ————–Section 10 Vote/Like System ———
    09:21:20 – 101 Vote/Like Theory
    09:26:36 – 102 Votes Table
    09:31:33 – 103 Votes Sqlalchemy
    09:34:11 – 104 Votes Route
    09:52:31 – 105 SQL Joins
    10:15:26 – 106 Joins in SqlAlchemy
    10:28:21 – 107 Get One Post with Joins

    ————–Section 11 Database Migration w/ Alembic————
    10:30:18 – 108 What is a database migration tool
    10:33:45 – 109 Alembic Setup
    10:42:29 – 110 Alembic First Revision
    10:51:49 – 111 Alembic Rollback database Schema
    10:56:27 – 112 Alembic finishing up the rest of the schema
    11:13:50 – 113 Disable SqlAlchemy create Engine

    —————Section 12 Pre Deployment Checklist —————–
    11:14:28 – 114 What is CORS?????
    11:23:38 – 115 Git PreReqs
    11:27:40 – 116 Git Install
    11:29:23 – 117 Github

    —————Section 13 Deployment Heroku—————————–
    11:34:39 – 118 Heroku intro
    11:35:40 – 119 Create Heroku App
    11:40:21 – 120 Heroku procfile
    11:44:59 – 121 Adding a Postgres database
    11:48:42 – 122 Environment Variables in Heroku
    11:58:59 – 123 Alembic migrations on Heroku Postgres instance
    12:02:52 – 124 Pushing changed to production

    ————–Section 14 Deployment Ubuntu——————————-
    12:05:04 – 125 Create an Ubuntu VM
    12:08:04 – 126 Update packages
    12:10:47 – 127 Install Python
    12:12:21 – 128 Install Postgres & setup password
    12:17:28 – 129 Postgres Config
    12:24:50 – 130 Create new user and setup python evironment
    12:34:06 – 131 Environment Variables
    12:42:24 – 132 Alembic migrations on production database
    12:45:57 – 133 Gunicorn
    12:54:12 – 134 Creating a Systemd service
    13:04:45 – 135 NGINX
    13:10:45 – 136 Setting up Domain name
    13:15:19 – 137 SSL/HTTPS
    13:19:31 – 138 NGINX enable
    13:20:06 – 139 Firewall
    13:23:47 – 140 Pushing code changes to Production

    —————Section 15 Docker—————————————
    13:26:09 – 141 Dockerfile
    13:38:39 – 142 Docker Compose
    13:48:34 – 143 Postgres Container
    13:56:22 – 144 Bind Mounts
    14:03:39 – 145 Dockerhub
    14:08:08 – 146 Production vs Development

    —————Section 16 Testing————————————–
    14:14:51 – 147 Testing Intro
    14:17:19 – 148 Writing your first test
    14:30:22 – 149 The -s & -v flags
    14:31:44 – 150 Testing more functions
    14:35:29 – 160 Parametrize
    14:40:21 – 170 Testing Classes
    14:48:37 – 171 Fixtures
    14:55:40 – 172 Combining Fixtures + Parametrize
    14:59:13 – 173 Testing Exceptions
    15:06:07 – 174 FastAPI TestClient
    15:14:26 – 175 Pytest flags
    15:17:31 – 176 Test create user
    15:25:23 – 177 Setup testing database
    15:36:47 – 178 Create & destroy database after each test
    15:44:18 – 179 More Fixtures to handle database interaction
    15:50:35 – 180 Trailing slashes in path
    15:53:12 – 181 Fixture scope
    16:07:50 – 182 Test user fixture
    16:14:40 – 183 Test/validate token
    16:18:59 – 184 Conftest.py
    16:22:09 – 185 Failed login test
    16:27:42 – 186 Get all posts test
    16:35:20 – 187 Posts fixture to create test posts
    16:51:15 – 188 Unauthorized Get Posts test
    16:52:35 – 189 Get one post test
    16:59:11 – 190 Create post test
    17:07:48 – 191 Delete post test
    17:15:06 – 192 Update post
    17:21:52 – 193 Voting tests

    —————-Section 17 CI/CD pipeline———————-
    17:34:15 – CI/CD intro
    17:43:29 – Github Actions
    17:49:32 – Creating Jobs
    17:57:38 – setup python/dependencies/pytest
    18:06:14 – Environment variables
    18:11:19 – Github Secrets
    18:18:14 – Testing database
    18:23:42 – Building Docker images
    18:34:33 – Deploy to heroku
    18:49:10 – Failing tests in pipeline
    18:52:18 – Deploy to Ubuntu

    1. @Michel Gutierrez this is now available in the video description, and it’s working fine from there.

  9. Truly incredible content. I’m currently a CS student and found this free course more helpful and practical than most of my classes. I really appreciate all the hard work Sanjeev and the team put into this; you guys are amazing!

  10. CHITUS💖⸻⸻⸻⸻⸻⸻⸻⸻⸻⸻⸻⸻⸻⸻⸻⸻⸻⸻⸻⸻⸻⸻⸻⸻⸻⸻⸻⸻⸻⸻⸻⸻⸻⸻⸻⸻⸻⸻⸻⸻⸻⸻

    Truly incredible content. I’m currently a CS student and found this free course more helpful and practical than most of my classes. I really appreciate all the hard work Sanjeev and the team put into this; you guys are amazing!

  11. Manjul Tripathi

    The humongous amount of information with such lucidity and patience that has been conveyed is really unbelievable!
    Kudos to Sanjeev!

  12. Finally finished it. Amazing experience. So thorough. The style of trying and committing errors and correcting it on the fly by suggesting alternatives and making us part of his thinking process to fix the errors was very helpful. The only thing missing was if he could have added a basic UI for the social media post with a simple frontend(React.js ?) would have made this tutorial a full package. But hey it can be an assignment for me to try that part. Have been hearing this man’s voice daily a little for over a month and now feels strange that I’ll miss it.

  13. This is Amazing!!!….. 19 hrs of content explaining from scratch to production with every small details and nuances…. Really really great job !!! These things one can only learn with experience that too by wandering all over the internet for different steps. you have put together everything that is necessary for an enterprise level application in a single video. Loved it!! Keep making such content.

  14. This course was very helpful!
    I’m not a programmer but have spent the last 4 months teaching myself Python and SQL. I need to develop the phone app for me and subscribers to access my program remotely but had no clue where to start. This course has definitely helped me understand the next steps I need to take. Thank you so much!

  15. İrfan Baykara

    I was a carpenter before this video, now I am a senior developer at SpaceX. You guys have changed my life!

    1. Aadityakiran S

      Why didn’t you learn a little magic, you could have started your own religion.

    2. Aadityakiran S

      @micheal magbagbeola He was a magic carpenter… weren’t you paying attention?

  16. Outstanding. What a wonderful framework to bootstrap my projects – going back and rewriting all my tinker projects as APIs. I learned a ton. Thank you so much.

  17. I did some digging in the psycopg2 implementation and I think I have an explanation that ties together what you’re addressing at 4:21:33 and 4:23:36.

    TLDR: Always use a ‘sequence’ like tuples, lists, and so on for the second parameter of cursor.execute(). For tuples with a single object, write ‘(object, )’ instead of ‘(object)’.

    Firstly, we should look at some signatures.

    The execute method for cursor objects:
    def execute(self, query: str | bytes | Composable, vars: _Vars = …) -> None: …

    The _Vars type alias:
    _Vars: TypeAlias = Sequence[Any] | Mapping[str, Any] | None

    These explain what makes the ‘convert to str’ workaround tick. But as you’ve demonstrated before while writing the create_posts function, you can pass non-string values (e.g., bools in the case of post.published) just fine. So, why wasn’t ‘(id)’ working? I think this is because of the weird syntax of Python’s tuples. ‘(id)’ is not necessarily a tuple, and therefore not a sequence either. But ‘(id, )’ is always a tuple in Python, and so it works just fine. But when you’re forcing it to be a tuple with that extra comma, your previous workaround of converting to string becomes redundant. And because that workaround doesn’t always work, I think it’s safe to say that we should try not to write code that way. I hope this helped.

  18. Furqaan Thakur

    SERIOUSLY AMAZING VIDEO!!! You can literally become a senior developer just by watching and implementing it.

  19. Tan kok feeng

    This is one of the best tutorials I found for beginners to understand APIs from scratch, really like how you explain the JWT part, it makes thing so clear and easy to understand. Really appreciate your hard work hope to see your tutorial more so we all can learn more x)

    1. Tan kok feeng

      @Akshay R R haven’t, I’m now at 7:28:00, and alr learnt lot of stuff like how to make a simple API, how to play with the API without a frontend and what is ORM, also he taught about the JWT stuff which is very interesting as well like how simple Web application can applied token based sign on and many more and I will continue watching it ltr on, it’s really beginner friendly, if you have only learnt about basic programming and have 0 knowledge on things like Flask-mega, fast api, rest api, databases, sql, this is the right videos. As the timestamp mentioned at the description, I believe we can learn more about how deployment works how to make unit testing and etc, this is definitely worth the time. And what’s more even better is, he will always show some error intended or accidentally, and will show the solution to it which is a good way for beginners to learn how a experienced programmer figure out and solved the problem 10/10

      Ps: I have learnt about flask mega before through the “Microblog” tutorials, and it is very hard for me as the tutor are teaching in a way that I’m not a beginner (I was really new to Web applications that time), so I highly recommend this if u are a fresh beginner like me that time

      Sorry for the long words, hope this will help you.

Comments are closed.